summaryrefslogtreecommitdiffstats
path: root/app/models/version.rb
blob: 6234732d78b7b6e39fd8f2b76a7c44f0b9bf3bf1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# redMine - project management software
# Copyright (C) 2006  Jean-Philippe Lang
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

class Version < ActiveRecord::Base
  before_destroy :check_integrity
  belongs_to :project
  has_many :fixed_issues, :class_name => 'Issue', :foreign_key => 'fixed_version_id'
  has_many :attachments, :as => :container, :dependent => :destroy

  validates_presence_of :name
  validates_uniqueness_of :name, :scope => [:project_id]
  validates_format_of :effective_date, :with => /^\d{4}-\d{2}-\d{2}$/, :message => :activerecord_error_not_a_date, :allow_nil => true
  
  def start_date
    effective_date
  end
  
  def due_date
    effective_date
  end
  
  def completed?
    effective_date && effective_date <= Date.today
  end
  
  def wiki_page
    if project.wiki && !wiki_page_title.blank?
      @wiki_page ||= project.wiki.find_page(wiki_page_title)
    end
    @wiki_page
  end
  
  # Versions are sorted by effective_date 
  # Those with no effective_date are at the end, sorted by name
  def <=>(version)
    if self.effective_date
      version.effective_date ? (self.effective_date <=> version.effective_date) : -1
    else
      version.effective_date ? 1 : (self.name <=> version.name)
    end
  end
  
private
  def check_integrity
    raise "Can't delete version" if self.fixed_issues.find(:first)
  end
end
lass="w"> </p> </info> <fo> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:svg="http://www.w3.org/2000/svg"> <fo:layout-master-set> <fo:simple-page-master master-name="normal" page-width="5in" page-height="5in"> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="normal" white-space-collapse="false"> <fo:flow flow-name="xsl-region-body"> <fo:block background-color="silver" margin="1pt 0pt 1pt 0pt"> spaces before and after each word <fo:character character="&#xa;" /> <fo:character character=" " /><fo:character character=" " /> and linefeeds<fo:character character=" " /><fo:character character=" " /> everywhere<fo:character character=" " /> </fo:block> <fo:block background-color="silver" margin="1pt 0pt 1pt 0pt"> <fo:block background-color="orange"> nested block level </fo:block> <fo:block background-color="red"> nested block level </fo:block> </fo:block> <fo:block background-color="silver" margin="1pt 0pt 1pt 0pt"> <fo:inline background-color="orange"> inline level </fo:inline> <fo:inline background-color="red"> inline level </fo:inline> </fo:block> <fo:block background-color="silver" margin="1pt 0pt 1pt 0pt"> block level <fo:inline background-color="orange"> inline level </fo:inline> block <fo:inline background-color="red"> inline level </fo:inline> block level </fo:block> <fo:block background-color="silver" margin="1pt 0pt 1pt 0pt"> <fo:inline background-color="orange"> inline level <fo:inline background-color="red"> nested inline level </fo:inline> </fo:inline> </fo:block> <fo:block background-color="silver" margin="1pt 0pt 1pt 0pt"> <fo:inline background-color="orange"> <fo:inline background-color="red"> nested inline level </fo:inline> inline level </fo:inline> </fo:block> <fo:block background-color="silver" margin="1pt 0pt 1pt 0pt"> block level <fo:inline background-color="orange"> <fo:inline background-color="red"> nested inline level </fo:inline> inline level </fo:inline> block level </fo:block> </fo:flow> </fo:page-sequence> </fo:root> </fo> <checks> <eval expected="5" xpath="count(//flow/block[1]/lineArea[1]/text[1]/word)"/> <eval expected="60" xpath="count(//flow/block[1]/lineArea[1]/text[1]/space)"/> <eval expected="1" xpath="count(//flow/block[1]/lineArea[2]/text[1]/word)"/> <eval expected="2" xpath="count(//flow/block[1]/lineArea[2]/text[1]/space)"/> <eval expected="3" xpath="count(//flow/block[2]/block[1]/lineArea[1]/text/word)"/> <eval expected="2" xpath="count(//flow/block[2]/block[1]/lineArea[1]/text/space)"/> <eval expected="3" xpath="count(//flow/block[2]/block[2]/lineArea[1]/text/word)"/> <eval expected="2" xpath="count(//flow/block[2]/block[2]/lineArea[1]/text/space)"/> <eval expected="2" xpath="count(//flow/block[3]/lineArea[1]/inlineparent[1]/text/word)"/> <eval expected="16" xpath="count(//flow/block[3]/lineArea[1]/inlineparent[1]/text/space)"/> <eval expected="13" xpath="count(//flow/block[3]/lineArea[1]/text[1]/space)"/> <eval expected="2" xpath="count(//flow/block[3]/lineArea[1]/inlineparent[2]/text/word)"/> <eval expected="16" xpath="count(//flow/block[3]/lineArea[1]/inlineparent[2]/text/space)"/> <eval expected="2" xpath="count(//flow/block[4]/lineArea[1]/text[1]/word)"/> <eval expected="16" xpath="count(//flow/block[4]/lineArea[1]/text[1]/space)"/> <eval expected="2" xpath="count(//flow/block[4]/lineArea[1]/inlineparent[1]/text/word)"/> <eval expected="31" xpath="count(//flow/block[4]/lineArea[1]/inlineparent[1]/text/space)"/> <eval expected="1" xpath="count(//flow/block[4]/lineArea[1]/text[2]/word)"/> <eval expected="13" xpath="count(//flow/block[4]/lineArea[1]/text[2]/space)"/> <eval expected="2" xpath="count(//flow/block[5]/lineArea[1]/inlineparent[1]/text/word)"/> <eval expected="18" xpath="count(//flow/block[5]/lineArea[1]/inlineparent[1]/text/space)"/> <eval expected="3" xpath="count(//flow/block[5]/lineArea[1]/inlineparent[1]/inlineparent[1]/text/word)"/> <eval expected="17" xpath="count(//flow/block[5]/lineArea[1]/inlineparent[1]/inlineparent[1]/text/space)"/> <eval expected="3" xpath="count(//flow/block[6]/lineArea[1]/inlineparent[1]/inlineparent[1]/text/word)"/> <eval expected="19" xpath="count(//flow/block[6]/lineArea[1]/inlineparent[1]/inlineparent[1]/text/space)"/> <eval expected="2" xpath="count(//flow/block[6]/lineArea[1]/inlineparent[1]/text/word)"/> <eval expected="16" xpath="count(//flow/block[6]/lineArea[1]/inlineparent[1]/text/space)"/> <eval expected="2" xpath="count(//flow/block[7]/lineArea[1]/text[1]/word)"/> <eval expected="14" xpath="count(//flow/block[7]/lineArea[1]/text[1]/space)"/> <eval expected="15" xpath="count(//flow/block[7]/lineArea[1]/inlineparent[1]/text[1]/space)"/> <eval expected="3" xpath="count(//flow/block[7]/lineArea[1]/inlineparent[1]/inlineparent[1]/text/word)"/> <eval expected="36" xpath="count(//flow/block[7]/lineArea[1]/inlineparent[1]/inlineparent[1]/text/space)"/> </checks> </testcase>