| 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 |
|
| 27 |
|
| 28 |
|
| 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 |
|
| 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 |
|
| 117 |
Digest::SHA1.hexdigest(rand(123434345).to_s + self.id.to_s + ticket_summary)[1..length] |
| 118 |
end |
| 119 |
|
| 120 |
end |