Blob of app/models/ticket.rb (raw blob data)

1 require "digest/sha1"
2
3 class Ticket < ActiveRecord::Base
4
5 belongs_to :assignee, :class_name => 'User', :foreign_key => 'assignee_id'
6 belongs_to :submitter, :class_name => 'User', :foreign_key => 'submitter_id'
7
8 def short_ttype
9 case self.ttype
10 when :enhancement
11 "Enh."
12 when :task
13 "Task"
14 when :defect
15 "Def."
16 end
17 end
18
19 def short_status
20 case self.status
21 when :proposed
22 "Prop."
23 when :open
24 "Open"
25 when :closed
26 "Clos."
27 when :deleted
28 "Del'd."
29 end
30 end
31
32 def short_impact
33 case self.impact
34 when :low
35 "Low"
36 when :high
37 "High"
38 when :security
39 "Sec."
40 end
41 end
42
43 def deep_clone
44 Marshal::load(Marshal.dump(self))
45 end
46
47 protected
48
49 #
50 # def self.find_by_milestone(milestone_id)
51 # find(:all, :conditions => ["milestone_id = '#{milestone_id}'"], :order => "due_date DESC")
52 # end
53
54 def self.find_by_slug(project_id, slug)
55 find(:first, :conditions => ["project_id = #{project_id} AND slug = '#{slug}'"])
56 end
57
58 def self.find_critical (project_id)
59 first_milestone = Milestone.find_current_milestone(project_id)
60 find_by_sql("SELECT tickets.slug,
61 tickets.summary,
62 users.fullname,
63 tickets.created_at
64 FROM tickets
65 JOIN users ON tickets.submitter_id = users.id
66 JOIN milestones ON tickets.milestone_id = milestones.id
67 WHERE milestones.id = #{first_milestone.id}
68 AND tickets.project_id = #{project_id}
69 AND tickets.status IN ('proposed', 'open')
70 AND tickets.priority = 'critical'
71 ORDER BY created_at DESC") if first_milestone
72 end
73
74 def self.find_recent (project_id)
75 first_milestone = Milestone.find_current_milestone(project_id)
76 find_by_sql("SELECT tickets.slug,
77 tickets.summary,
78 users.fullname,
79 tickets.created_at
80 FROM tickets
81 JOIN users ON tickets.submitter_id = users.id
82 JOIN milestones ON tickets.milestone_id = milestones.id
83 WHERE milestones.id = #{first_milestone.id}
84 AND tickets.project_id = #{project_id}
85 AND tickets.status IN ('proposed', 'open')
86 AND NOT tickets.priority = 'critical'
87 ORDER BY created_at DESC
88 LIMIT 3") if first_milestone
89 end
90
91 def self.qconcat (filters, types, lstart)
92 s = ""
93 types.each do |t|
94 if filters[t] == "1"
95 s << ", " if s.length > 0
96 s << "'" << t.to_s[lstart..t.to_s.length] << "'"
97 end
98 end
99 !s.empty? ? s : nil
100 end
101
102 #
103 def self.filtered (filters = {})
104
105 ttype = qconcat(filters, [:ttype_defect, :ttype_enhancement, :ttype_task], 6)
106 status = qconcat(filters, [:status_proposed, :status_open, :status_closed], 7)
107 impact = qconcat(filters, [:impact_low, :impact_high, :impact_security], 7)
108 priority = qconcat(filters, [:priority_none, :priority_low, :priority_high, :priority_critical], 9)
109
110 w = "WHERE true "
111 w << "AND tickets.ttype IN (#{ttype})\n" if ttype
112 w << "AND tickets.status IN (#{status})\n" if status
113 w << "AND tickets.impact IN (#{impact})\n" if impact
114 w << "AND tickets.priority IN (#{priority})\n" if priority
115 #w << "AND tickets.audience IN (#{audience})\n"
116
117 w << "AND milestones.id = #{filters[:milestone_id]}\n" if filters[:milestone_id] && filters[:milestone_id].length > 0
118 w << "AND assignee_id = #{filters[:assignee_id]}\n" if filters[:assignee_id] && filters[:assignee_id].length > 0
119 w << "AND submitter_id = #{filters[:submitter_id]}\n" if filters[:submitter_id] && filters[:submitter_id].length > 0
120
121 find_by_sql("SELECT tickets.slug,
122 tickets.summary,
123 tickets.ttype,
124 tickets.status,
125 tickets.impact,
126 tickets.priority,
127 tickets.audience,
128 users.fullname AS fullname,
129 milestones.name AS name,
130 milestone_id
131 FROM tickets
132 LEFT JOIN users ON tickets.assignee_id = users.id
133 LEFT JOIN milestones ON tickets.milestone_id = milestones.id
134 #{w}
135 ORDER BY milestones.due_date ASC, priority DESC")
136 end
137
138 #
139 def self.generate_key(ticket_summary, length = 6)
140 #FIXME crap
141 Digest::SHA1.hexdigest(rand(123434345).to_s + self.id.to_s + ticket_summary)[1..length]
142 end
143
144 end