Commit 0727edd8a0c68b640b95fabce21472b04a806562
1 parent
3fe9d297
Exists in
master
and in
4 other branches
Removed issues,mr delete buttons. Refactored models
Showing
13 changed files
with
82 additions
and
186 deletions
Show diff stats
app/controllers/merge_requests_controller.rb
... | ... | @@ -30,7 +30,7 @@ class MergeRequestsController < ApplicationController |
30 | 30 | else @merge_requests.opened |
31 | 31 | end |
32 | 32 | |
33 | - @merge_requests = @merge_requests.includes(:author, :project) | |
33 | + @merge_requests = @merge_requests.includes(:author, :project).order("created_at desc") | |
34 | 34 | end |
35 | 35 | |
36 | 36 | def show | ... | ... |
app/models/key.rb
... | ... | @@ -14,8 +14,6 @@ class Key < ActiveRecord::Base |
14 | 14 | |
15 | 15 | before_save :set_identifier |
16 | 16 | before_validation :strip_white_space |
17 | - after_save :update_repository | |
18 | - after_destroy :repository_delete_key | |
19 | 17 | delegate :name, :email, :to => :user, :prefix => true |
20 | 18 | validate :unique_key |
21 | 19 | ... | ... |
app/models/project.rb
... | ... | @@ -3,19 +3,17 @@ require "grit" |
3 | 3 | class Project < ActiveRecord::Base |
4 | 4 | belongs_to :owner, :class_name => "User" |
5 | 5 | |
6 | - has_many :events, :dependent => :destroy | |
6 | + has_many :users, :through => :users_projects | |
7 | + has_many :events, :dependent => :destroy | |
7 | 8 | has_many :merge_requests, :dependent => :destroy |
8 | - has_many :issues, :dependent => :destroy, :order => "position" | |
9 | + has_many :issues, :dependent => :destroy, :order => "position" | |
9 | 10 | has_many :users_projects, :dependent => :destroy |
10 | - has_many :users, :through => :users_projects | |
11 | - has_many :notes, :dependent => :destroy | |
12 | - has_many :snippets, :dependent => :destroy | |
13 | - has_many :deploy_keys, :dependent => :destroy, :foreign_key => "project_id", :class_name => "Key" | |
14 | - has_many :web_hooks, :dependent => :destroy | |
11 | + has_many :notes, :dependent => :destroy | |
12 | + has_many :snippets, :dependent => :destroy | |
13 | + has_many :deploy_keys, :dependent => :destroy, :foreign_key => "project_id", :class_name => "Key" | |
14 | + has_many :web_hooks, :dependent => :destroy | |
15 | + has_many :wikis, :dependent => :destroy | |
15 | 16 | has_many :protected_branches, :dependent => :destroy |
16 | - has_many :wikis, :dependent => :destroy | |
17 | - | |
18 | - acts_as_taggable | |
19 | 17 | |
20 | 18 | validates :name, |
21 | 19 | :uniqueness => true, |
... | ... | @@ -39,15 +37,10 @@ class Project < ActiveRecord::Base |
39 | 37 | :message => "only letters, digits & '_' '-' '.' allowed" }, |
40 | 38 | :length => { :within => 3..255 } |
41 | 39 | |
42 | - validates :owner, | |
43 | - :presence => true | |
44 | - | |
40 | + validates :owner, :presence => true | |
45 | 41 | validate :check_limit |
46 | 42 | validate :repo_name |
47 | 43 | |
48 | - after_destroy :destroy_repository | |
49 | - after_save :update_repository | |
50 | - | |
51 | 44 | attr_protected :private_flag, :owner_id |
52 | 45 | |
53 | 46 | scope :public_only, where(:private_flag => false) |
... | ... | @@ -163,18 +156,6 @@ class Project < ActiveRecord::Base |
163 | 156 | users_projects.find_by_user_id(user_id) |
164 | 157 | end |
165 | 158 | |
166 | - def fresh_merge_requests(n) | |
167 | - merge_requests.includes(:project, :author).order("created_at desc").first(n) | |
168 | - end | |
169 | - | |
170 | - def fresh_issues(n) | |
171 | - issues.includes(:project, :author).order("created_at desc").first(n) | |
172 | - end | |
173 | - | |
174 | - def fresh_notes(n) | |
175 | - notes.inc_author_project.order("created_at desc").first(n) | |
176 | - end | |
177 | - | |
178 | 159 | def common_notes |
179 | 160 | notes.where(:noteable_type => ["", nil]).inc_author_project |
180 | 161 | end |
... | ... | @@ -277,9 +258,7 @@ class Project < ActiveRecord::Base |
277 | 258 | end |
278 | 259 | |
279 | 260 | def last_activity |
280 | - events.last | |
281 | - rescue | |
282 | - nil | |
261 | + events.last || nil | |
283 | 262 | end |
284 | 263 | |
285 | 264 | def last_activity_date |
... | ... | @@ -294,43 +273,6 @@ class Project < ActiveRecord::Base |
294 | 273 | last_activity_date |
295 | 274 | end |
296 | 275 | |
297 | - # Get project updates from cache | |
298 | - # or calculate. | |
299 | - def cached_updates(limit, expire = 2.minutes) | |
300 | - activities_key = "project_#{id}_activities" | |
301 | - cached_activities = Rails.cache.read(activities_key) | |
302 | - if cached_activities | |
303 | - activities = cached_activities | |
304 | - else | |
305 | - activities = updates(limit) | |
306 | - Rails.cache.write(activities_key, activities, :expires_in => expire) | |
307 | - end | |
308 | - | |
309 | - activities | |
310 | - end | |
311 | - | |
312 | - # Get 20 events for project like | |
313 | - # commits, issues or notes | |
314 | - def updates(n = 3) | |
315 | - [ | |
316 | - fresh_commits(n), | |
317 | - fresh_issues(n), | |
318 | - fresh_notes(n) | |
319 | - ].compact.flatten.sort do |x, y| | |
320 | - y.created_at <=> x.created_at | |
321 | - end[0...n] | |
322 | - end | |
323 | - | |
324 | - def activities(n=3) | |
325 | - [ | |
326 | - fresh_issues(n), | |
327 | - fresh_merge_requests(n), | |
328 | - notes.inc_author_project.where("noteable_type is not null").order("created_at desc").first(n) | |
329 | - ].compact.flatten.sort do |x, y| | |
330 | - y.created_at <=> x.created_at | |
331 | - end[0...n] | |
332 | - end | |
333 | - | |
334 | 276 | def check_limit |
335 | 277 | unless owner.can_create_project? |
336 | 278 | errors[:base] << ("Your own projects limit is #{owner.projects_limit}! Please contact administrator to increase it") | ... | ... |
app/views/issues/_form.html.haml
... | ... | @@ -9,6 +9,10 @@ |
9 | 9 | %li= msg |
10 | 10 | |
11 | 11 | .clearfix |
12 | + = f.label :title | |
13 | + .input= f.text_area :title, :maxlength => 255, :class => "xxlarge" | |
14 | + | |
15 | + .clearfix | |
12 | 16 | = f.label :assignee_id |
13 | 17 | .input= f.select(:assignee_id, @project.users.all.collect {|p| [ p.name, p.id ] }, { :include_blank => "Select user" }) |
14 | 18 | |
... | ... | @@ -21,9 +25,6 @@ |
21 | 25 | = f.label :closed |
22 | 26 | .input= f.check_box :closed |
23 | 27 | |
24 | - .clearfix | |
25 | - = f.label :title | |
26 | - .input= f.text_area :title, :maxlength => 255, :class => "xxlarge" | |
27 | 28 | .actions |
28 | 29 | = f.submit 'Save', :class => "primary btn" |
29 | 30 | |
... | ... | @@ -34,8 +35,3 @@ |
34 | 35 | = link_to "Cancel", project_issues_path(@project), :class => "btn" |
35 | 36 | - else |
36 | 37 | = link_to "Cancel", project_issue_path(@project, @issue), :class => "btn" |
37 | - | |
38 | - | |
39 | - - unless @issue.new_record? | |
40 | - .right | |
41 | - = link_to 'Remove', [@project, @issue], :confirm => 'Are you sure?', :method => :delete, :class => "danger btn" | ... | ... |
app/views/issues/_show.html.haml
... | ... | @@ -6,8 +6,6 @@ |
6 | 6 | - else |
7 | 7 | = link_to 'Resolve', project_issue_path(issue.project, issue, :issue => {:closed => true }, :status_only => true), :method => :put, :class => "success btn small", :remote => true |
8 | 8 | = link_to 'Edit', edit_project_issue_path(issue.project, issue), :class => "btn small edit-issue-link", :remote => true |
9 | - -#- if can?(current_user, :admin_issue, @project) || issue.author == current_user | |
10 | - = link_to 'Remove', [issue.project, issue], :confirm => 'Are you sure?', :method => :delete, :remote => true, :class => "danger btn small delete-issue", :id => "destroy_issue_#{issue.id}" | |
11 | 9 | = image_tag gravatar_icon(issue.assignee_email), :class => "avatar" |
12 | 10 | %span.update-author |
13 | 11 | assigned to | ... | ... |
app/views/merge_requests/_form.html.haml
... | ... | @@ -6,6 +6,9 @@ |
6 | 6 | %li= msg |
7 | 7 | |
8 | 8 | .clearfix |
9 | + = f.label :title | |
10 | + .input= f.text_area :title, :class => "xxlarge", :maxlength => 255, :rows => 5 | |
11 | + .clearfix | |
9 | 12 | = f.label :source_branch, "From" |
10 | 13 | .input= f.select(:source_branch, @project.heads.map(&:name), { :include_blank => "Select branch" }, :style => "width:250px") |
11 | 14 | .clearfix |
... | ... | @@ -15,9 +18,6 @@ |
15 | 18 | = f.label :assignee_id, "Assign to" |
16 | 19 | .input= f.select(:assignee_id, @project.users.all.collect {|p| [ p.name, p.id ] }, { :include_blank => "Select user" }, :style => "width:250px") |
17 | 20 | |
18 | - .clearfix | |
19 | - = f.label :title | |
20 | - .input= f.text_area :title, :class => "xlarge", :maxlength => 255, :rows => 5 | |
21 | 21 | .actions |
22 | 22 | = f.submit 'Save', :class => "primary btn" |
23 | 23 | - if @merge_request.new_record? |
... | ... | @@ -26,11 +26,6 @@ |
26 | 26 | - else |
27 | 27 | = link_to project_merge_request_path(@project, @merge_request), :class => "btn" do |
28 | 28 | Cancel |
29 | - | |
30 | - - unless @merge_request.new_record? | |
31 | - .right | |
32 | - = link_to 'Remove', [@project, @merge_request], :confirm => 'Are you sure?', :method => :delete, :class => "btn danger" | |
33 | - | |
34 | 29 | |
35 | 30 | |
36 | 31 | ... | ... |
app/views/projects/index.html.haml
1 | -- unless @projects.empty? | |
2 | - .row | |
3 | - .span4 | |
4 | - %div.leftbar.ui-box | |
5 | - %h5 | |
6 | - Projects | |
7 | - - if current_user.can_create_project? | |
8 | - %span.right | |
9 | - = link_to new_project_path, :class => "btn very_small info" do | |
10 | - New Project | |
11 | - .content_list | |
12 | - - @projects.each do |project| | |
13 | - = link_to project_path(project), :remote => true, :class => dom_class(project) do | |
14 | - %h4 | |
15 | - %span.ico.project | |
16 | - = truncate(project.name, :length => 22) | |
17 | - .span12.right | |
18 | - .show_holder.ui-box.padded | |
19 | - .loading | |
20 | - | |
21 | -- else | |
22 | - %h2 Nothing here | |
1 | +.row | |
2 | + .span4 | |
3 | + %div.leftbar.ui-box | |
4 | + %h5 | |
5 | + Projects | |
6 | + - if current_user.can_create_project? | |
7 | + %span.right | |
8 | + = link_to new_project_path, :class => "btn very_small info" do | |
9 | + New Project | |
10 | + .content_list | |
11 | + - @projects.each do |project| | |
12 | + = link_to project_path(project), :remote => true, :class => dom_class(project) do | |
13 | + %h4 | |
14 | + %span.ico.project | |
15 | + = truncate(project.name, :length => 22) | |
16 | + .span12.right | |
17 | + .show_holder.ui-box.padded | |
18 | + .loading | |
23 | 19 | |
24 | 20 | |
25 | 21 | :javascript | ... | ... |
config/application.rb
... | ... | @@ -23,7 +23,7 @@ module Gitlab |
23 | 23 | # config.plugins = [ :exception_notification, :ssl_requirement, :all ] |
24 | 24 | |
25 | 25 | # Activate observers that should always be running. |
26 | - config.active_record.observers = :mailer_observer, :activity_observer | |
26 | + config.active_record.observers = :mailer_observer, :activity_observer, :project_observer, :key_observer | |
27 | 27 | |
28 | 28 | # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. |
29 | 29 | # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. | ... | ... |
db/schema.rb
... | ... | @@ -24,25 +24,13 @@ ActiveRecord::Schema.define(:version => 20120301185805) do |
24 | 24 | t.integer "action" |
25 | 25 | end |
26 | 26 | |
27 | - create_table "features", :force => true do |t| | |
28 | - t.string "name" | |
29 | - t.string "branch_name" | |
30 | - t.integer "assignee_id" | |
31 | - t.integer "author_id" | |
32 | - t.integer "project_id" | |
33 | - t.datetime "created_at" | |
34 | - t.datetime "updated_at" | |
35 | - t.string "version" | |
36 | - t.integer "status", :default => 0, :null => false | |
37 | - end | |
38 | - | |
39 | 27 | create_table "issues", :force => true do |t| |
40 | 28 | t.string "title" |
41 | 29 | t.integer "assignee_id" |
42 | 30 | t.integer "author_id" |
43 | 31 | t.integer "project_id" |
44 | - t.datetime "created_at" | |
45 | - t.datetime "updated_at" | |
32 | + t.datetime "created_at", :null => false | |
33 | + t.datetime "updated_at", :null => false | |
46 | 34 | t.boolean "closed", :default => false, :null => false |
47 | 35 | t.integer "position", :default => 0 |
48 | 36 | t.boolean "critical", :default => false, :null => false |
... | ... | @@ -53,8 +41,8 @@ ActiveRecord::Schema.define(:version => 20120301185805) do |
53 | 41 | |
54 | 42 | create_table "keys", :force => true do |t| |
55 | 43 | t.integer "user_id" |
56 | - t.datetime "created_at" | |
57 | - t.datetime "updated_at" | |
44 | + t.datetime "created_at", :null => false | |
45 | + t.datetime "updated_at", :null => false | |
58 | 46 | t.text "key" |
59 | 47 | t.string "title" |
60 | 48 | t.string "identifier" |
... | ... | @@ -69,8 +57,8 @@ ActiveRecord::Schema.define(:version => 20120301185805) do |
69 | 57 | t.integer "assignee_id" |
70 | 58 | t.string "title" |
71 | 59 | t.boolean "closed", :default => false, :null => false |
72 | - t.datetime "created_at" | |
73 | - t.datetime "updated_at" | |
60 | + t.datetime "created_at", :null => false | |
61 | + t.datetime "updated_at", :null => false | |
74 | 62 | end |
75 | 63 | |
76 | 64 | add_index "merge_requests", ["project_id"], :name => "index_merge_requests_on_project_id" |
... | ... | @@ -80,8 +68,8 @@ ActiveRecord::Schema.define(:version => 20120301185805) do |
80 | 68 | t.string "noteable_id" |
81 | 69 | t.string "noteable_type" |
82 | 70 | t.integer "author_id" |
83 | - t.datetime "created_at" | |
84 | - t.datetime "updated_at" | |
71 | + t.datetime "created_at", :null => false | |
72 | + t.datetime "updated_at", :null => false | |
85 | 73 | t.integer "project_id" |
86 | 74 | t.string "attachment" |
87 | 75 | t.string "line_code" |
... | ... | @@ -94,8 +82,8 @@ ActiveRecord::Schema.define(:version => 20120301185805) do |
94 | 82 | t.string "name" |
95 | 83 | t.string "path" |
96 | 84 | t.text "description" |
97 | - t.datetime "created_at" | |
98 | - t.datetime "updated_at" | |
85 | + t.datetime "created_at", :null => false | |
86 | + t.datetime "updated_at", :null => false | |
99 | 87 | t.boolean "private_flag", :default => true, :null => false |
100 | 88 | t.string "code" |
101 | 89 | t.integer "owner_id" |
... | ... | @@ -118,8 +106,8 @@ ActiveRecord::Schema.define(:version => 20120301185805) do |
118 | 106 | t.text "content" |
119 | 107 | t.integer "author_id", :null => false |
120 | 108 | t.integer "project_id", :null => false |
121 | - t.datetime "created_at" | |
122 | - t.datetime "updated_at" | |
109 | + t.datetime "created_at", :null => false | |
110 | + t.datetime "updated_at", :null => false | |
123 | 111 | t.string "file_name" |
124 | 112 | t.datetime "expires_at" |
125 | 113 | end |
... | ... | @@ -152,8 +140,8 @@ ActiveRecord::Schema.define(:version => 20120301185805) do |
152 | 140 | t.datetime "last_sign_in_at" |
153 | 141 | t.string "current_sign_in_ip" |
154 | 142 | t.string "last_sign_in_ip" |
155 | - t.datetime "created_at" | |
156 | - t.datetime "updated_at" | |
143 | + t.datetime "created_at", :null => false | |
144 | + t.datetime "updated_at", :null => false | |
157 | 145 | t.string "name" |
158 | 146 | t.boolean "admin", :default => false, :null => false |
159 | 147 | t.integer "projects_limit", :default => 10 |
... | ... | @@ -171,16 +159,16 @@ ActiveRecord::Schema.define(:version => 20120301185805) do |
171 | 159 | create_table "users_projects", :force => true do |t| |
172 | 160 | t.integer "user_id", :null => false |
173 | 161 | t.integer "project_id", :null => false |
174 | - t.datetime "created_at" | |
175 | - t.datetime "updated_at" | |
162 | + t.datetime "created_at", :null => false | |
163 | + t.datetime "updated_at", :null => false | |
176 | 164 | t.integer "project_access", :default => 0, :null => false |
177 | 165 | end |
178 | 166 | |
179 | 167 | create_table "web_hooks", :force => true do |t| |
180 | 168 | t.string "url" |
181 | 169 | t.integer "project_id" |
182 | - t.datetime "created_at" | |
183 | - t.datetime "updated_at" | |
170 | + t.datetime "created_at", :null => false | |
171 | + t.datetime "updated_at", :null => false | |
184 | 172 | end |
185 | 173 | |
186 | 174 | create_table "wikis", :force => true do |t| | ... | ... |
spec/models/project_spec.rb
... | ... | @@ -2,13 +2,17 @@ require 'spec_helper' |
2 | 2 | |
3 | 3 | describe Project do |
4 | 4 | describe "Associations" do |
5 | - it { should have_many(:events) } | |
6 | 5 | it { should have_many(:users) } |
7 | - it { should have_many(:users_projects) } | |
8 | - it { should have_many(:issues) } | |
9 | - it { should have_many(:notes) } | |
10 | - it { should have_many(:snippets) } | |
6 | + it { should have_many(:protected_branches).dependent(:destroy) } | |
7 | + it { should have_many(:events).dependent(:destroy) } | |
8 | + it { should have_many(:wikis).dependent(:destroy) } | |
9 | + it { should have_many(:merge_requests).dependent(:destroy) } | |
10 | + it { should have_many(:users_projects).dependent(:destroy) } | |
11 | + it { should have_many(:issues).dependent(:destroy) } | |
12 | + it { should have_many(:notes).dependent(:destroy) } | |
13 | + it { should have_many(:snippets).dependent(:destroy) } | |
11 | 14 | it { should have_many(:web_hooks).dependent(:destroy) } |
15 | + it { should have_many(:deploy_keys).dependent(:destroy) } | |
12 | 16 | end |
13 | 17 | |
14 | 18 | describe "Validation" do |
... | ... | @@ -70,30 +74,6 @@ describe Project do |
70 | 74 | end |
71 | 75 | end |
72 | 76 | |
73 | - describe "updates" do | |
74 | - let(:project) { Factory :project } | |
75 | - | |
76 | - before do | |
77 | - @issue = Factory :issue, | |
78 | - :project => project, | |
79 | - :author => Factory(:user), | |
80 | - :assignee => Factory(:user) | |
81 | - | |
82 | - @note = Factory :note, | |
83 | - :project => project, | |
84 | - :author => Factory(:user) | |
85 | - | |
86 | - @commit = project.fresh_commits(1).first | |
87 | - end | |
88 | - | |
89 | - describe "return commit, note & issue" do | |
90 | - it { project.updates(3).count.should == 3 } | |
91 | - it { project.updates(3).last.id.should == @commit.id } | |
92 | - it { project.updates(3).include?(@issue).should be_true } | |
93 | - it { project.updates(3).include?(@note).should be_true } | |
94 | - end | |
95 | - end | |
96 | - | |
97 | 77 | describe "last_activity" do |
98 | 78 | let(:project) { Factory :project } |
99 | 79 | ... | ... |
spec/requests/issues_spec.rb
... | ... | @@ -46,21 +46,6 @@ describe "Issues" do |
46 | 46 | page.body.should have_selector("entry summary", :text => @issue.title) |
47 | 47 | end |
48 | 48 | |
49 | - describe "Destroy" do | |
50 | - before do | |
51 | - # admin access to remove issue | |
52 | - @user.users_projects.destroy_all | |
53 | - project.add_access(@user, :read, :write, :admin) | |
54 | - visit edit_project_issue_path(project, @issue) | |
55 | - end | |
56 | - | |
57 | - it "should remove entry" do | |
58 | - expect { | |
59 | - click_link "Remove" | |
60 | - }.to change { Issue.count }.by(-1) | |
61 | - end | |
62 | - end | |
63 | - | |
64 | 49 | describe "statuses" do |
65 | 50 | before do |
66 | 51 | @closed_issue = Factory :issue, | ... | ... |