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 formatted_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 deep_clone
20 Marshal::load(Marshal.dump(self))
21 end
22
23 protected
24
25 #
26 # def self.find_by_milestone(milestone_id)
27 # find(:all, :conditions => ["milestone_id = '#{milestone_id}'"], :order => "due_date DESC")
28 # end
29
30 def self.find_by_slug(project_id, slug)
31 find(:first, :conditions => ["project_id = #{project_id} AND slug = '#{slug}'"])
32 end
33
34 def self.find_critical (project_id)
35 first_milestone = Milestone.find_current_milestone(project_id)
36 find_by_sql("SELECT tickets.slug,
37 tickets.summary,
38 users.fullname,
39 tickets.created_at
40 FROM tickets
41 JOIN users ON tickets.submitter_id = users.id
42 JOIN milestones ON tickets.milestone_id = milestones.id
43 WHERE milestones.id = #{first_milestone.id}
44 AND tickets.project_id = #{project_id}
45 AND tickets.status IN ('proposed', 'open')
46 AND tickets.priority = 'critical'
47 ORDER BY created_at DESC") if first_milestone
48 end
49
50 def self.find_recent (project_id)
51 first_milestone = Milestone.find_current_milestone(project_id)
52 find_by_sql("SELECT tickets.slug,
53 tickets.summary,
54 users.fullname,
55 tickets.created_at
56 FROM tickets
57 JOIN users ON tickets.submitter_id = users.id
58 JOIN milestones ON tickets.milestone_id = milestones.id
59 WHERE milestones.id = #{first_milestone.id}
60 AND tickets.project_id = #{project_id}
61 AND tickets.status IN ('proposed', 'open')
62 AND NOT tickets.priority = 'critical'
63 ORDER BY created_at DESC
64 LIMIT 3") if first_milestone
65 end
66
67 def self.qconcat (filters, types, lstart)
68 s = ""
69 types.each do |t|
70 if filters[t] == "1"
71 s << ", " if s.length > 0
72 s << "'" << t.to_s[lstart..t.to_s.length] << "'"
73 end
74 end
75 !s.empty? ? s : nil
76 end
77
78 #
79 def self.filtered (filters = {})
80
81 ttype = qconcat(filters, [:ttype_defect, :ttype_enhancement, :ttype_task], 6)
82 status = qconcat(filters, [:status_proposed, :status_open, :status_closed], 7)
83 impact = qconcat(filters, [:impact_low, :impact_high, :impact_security], 7)
84 priority = qconcat(filters, [:priority_none, :priority_low, :priority_high, :priority_critical], 9)
85
86 w = "WHERE true "
87 w << "AND tickets.ttype IN (#{ttype})\n" if ttype
88 w << "AND tickets.status IN (#{status})\n" if status
89 w << "AND tickets.impact IN (#{impact})\n" if impact
90 w << "AND tickets.priority IN (#{priority})\n" if priority
91 #w << "AND tickets.audience IN (#{audience})\n"
92
93 w << "AND milestones.id = #{filters[:milestone_id]}\n" if filters[:milestone_id] && filters[:milestone_id].length > 0
94 w << "AND assignee_id = #{filters[:assignee_id]}\n" if filters[:assignee_id] && filters[:assignee_id].length > 0
95 w << "AND submitter_id = #{filters[:submitter_id]}\n" if filters[:submitter_id] && filters[:submitter_id].length > 0
96
97 find_by_sql("SELECT tickets.slug,
98 tickets.summary,
99 tickets.ttype,
100 tickets.status,
101 tickets.impact,
102 tickets.priority,
103 tickets.audience,
104 users.fullname AS fullname,
105 milestones.name AS name,
106 milestone_id
107 FROM tickets
108 LEFT JOIN users ON tickets.assignee_id = users.id
109 LEFT JOIN milestones ON tickets.milestone_id = milestones.id
110 #{w}
111 ORDER BY milestones.due_date ASC, priority DESC")
112 end
113
114 #
115 def self.generate_key(ticket_summary, length = 6)
116 #FIXME crap
117 Digest::SHA1.hexdigest(rand(123434345).to_s + self.id.to_s + ticket_summary)[1..length]
118 end
119
120 end