Handle removed author when rendering comments
[gitorious:mainline.git] / app / models / merge_request_status.rb
1 # encoding: utf-8
2 #--
3 #   Copyright (C) 2012-2013 Gitorious AS
4 #   Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
5 #
6 #   This program is free software: you can redistribute it and/or modify
7 #   it under the terms of the GNU Affero General Public License as published by
8 #   the Free Software Foundation, either version 3 of the License, or
9 #   (at your option) any later version.
10 #
11 #   This program is distributed in the hope that it will be useful,
12 #   but WITHOUT ANY WARRANTY; without even the implied warranty of
13 #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 #   GNU Affero General Public License for more details.
15 #
16 #   You should have received a copy of the GNU Affero General Public License
17 #   along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 #++
19
20 class MergeRequestStatus < ActiveRecord::Base
21   COLOR_REGEXP = /^#[0-9a-f]{3}{1,2}$/i
22   belongs_to :project
23
24   validates_presence_of :project, :state, :name
25   validates_format_of :color, :with => COLOR_REGEXP,
26     :message => "should be hex encoded (eg '#cccccc', like in CSS)", :allow_blank => true
27
28   before_save :synchronize_merge_request_statuses
29
30   def self.default
31     where(:default => true).first
32   end
33
34   def self.create_defaults_for_project(project)
35     project.merge_request_statuses.create!({
36         :name => "Open",
37         :state => MergeRequest::STATUS_OPEN,
38         :color => "#408000",
39         :default => true
40       })
41     project.merge_request_statuses.create!({
42         :name => "Closed",
43         :state => MergeRequest::STATUS_CLOSED,
44         :color => "#AA0000"
45       })
46   end
47
48   def self.default_states
49     {
50       "Open" => MergeRequest::STATUS_OPEN,
51       "Closed" => MergeRequest::STATUS_CLOSED
52     }
53   end
54
55   def self.open?(name)
56     default_states[name] == MergeRequest::STATUS_OPEN
57   end
58
59   def open?
60     state == MergeRequest::STATUS_OPEN
61   end
62
63   def closed?
64     state == MergeRequest::STATUS_CLOSED
65   end
66
67   # Updates the status of all the merge requests for the mainlines in
68   # the project who has the same status_tag as this MergeRequestStatus
69   def synchronize_merge_request_statuses
70     if state_changed? || name_changed?
71       # FIXME: doing it like this is a bit inefficient...
72       merge_requests = self.project.repositories.mainlines.map(&:merge_requests).flatten
73       old_name = (name_changed? ? name_change.first : name)
74       merge_requests.select{|mr| mr.status_tag.to_s == old_name }.each do |mr|
75         mr.status = self.state if state_changed?
76         mr.status_tag = self.name if name_changed?
77         mr.save!
78       end
79     end
80   end
81 end