| call.rb - warvox - VoIP based wardialing tool, forked from rapid7/warvox. | |
| git clone git://jay.scot/warvox | |
| Log | |
| Files | |
| Refs | |
| README | |
| --- | |
| call.rb (4559B) | |
| --- | |
| 1 # == Schema Information | |
| 2 # | |
| 3 # Table name: calls | |
| 4 # | |
| 5 # id :integer not null, primary key | |
| 6 # created_at :datetime | |
| 7 # updated_at :datetime | |
| 8 # number :text not null | |
| 9 # project_id :integer not null | |
| 10 # job_id :integer not null | |
| 11 # provider_id :integer not null | |
| 12 # answered :boolean | |
| 13 # busy :boolean | |
| 14 # error :text | |
| 15 # audio_length :integer | |
| 16 # ring_length :integer | |
| 17 # caller_id :text | |
| 18 # analysis_job_id :integer | |
| 19 # analysis_started_at :datetime | |
| 20 # analysis_completed_at :datetime | |
| 21 # peak_freq :float | |
| 22 # peak_freq_data :text | |
| 23 # line_type :text | |
| 24 # fprint :integer is an Array | |
| 25 # | |
| 26 | |
| 27 class Call < ApplicationRecord | |
| 28 | |
| 29 reportable :hourly, aggregation: :count, grouping: :hour, live_data: t… | |
| 30 reportable :daily, aggregation: :count, grouping: :day, live_data: tru… | |
| 31 reportable :weekly, aggregation: :count, grouping: :week, live_data: t… | |
| 32 reportable :monthly, aggregation: :count, grouping: :month, live_data:… | |
| 33 | |
| 34 reportable :analyzed_hourly, aggregation: :count, grouping: :hour, dat… | |
| 35 reportable :analyzed_daily, aggregation: :count, grouping: :day, date_… | |
| 36 reportable :analyzed_weekly, aggregation: :count, grouping: :week, dat… | |
| 37 reportable :analyzed_monthly, aggregation: :count, grouping: :month, d… | |
| 38 | |
| 39 belongs_to :project | |
| 40 belongs_to :provider | |
| 41 belongs_to :job | |
| 42 has_one :call_medium, dependent: :delete | |
| 43 | |
| 44 def matches | |
| 45 # "AND (( icount(\'{#{fprint.map{|x| x.to_s}.join(",")}}\'::int[]… | |
| 46 self.find_by_sql([ | |
| 47 'SELECT calls.*, ' + | |
| 48 " (( icount(ARRAY[?]::int[] & calls.fprint::int[]) / icount(ARRAY… | |
| 49 'FROM calls ' + | |
| 50 'WHERE icount(calls.fprint) > 0 AND ' + | |
| 51 "calls.job_id = ? AND " + | |
| 52 "calls.id != ? " + | |
| 53 'ORDER BY matchscore DESC', | |
| 54 fprint_map, | |
| 55 fprint_map, | |
| 56 self.job_id, | |
| 57 self.id | |
| 58 ]) | |
| 59 end | |
| 60 | |
| 61 def matches_all_jobs | |
| 62 | |
| 63 # "AND (( icount(\'{#{fprint.map{|x| x.to_s}.join(",")}}\'::int[]… | |
| 64 self.find_by_sql([ | |
| 65 'SELECT calls.*, ' + | |
| 66 " (( icount(ARRAY[?]::int[] & calls.fprint::int[]) / icount(ARRAY… | |
| 67 'FROM calls ' + | |
| 68 'WHERE icount(calls.fprint) > 0 AND ' + | |
| 69 "calls.id != ? " + | |
| 70 'ORDER BY matchscore DESC', | |
| 71 fprint, | |
| 72 fprint, | |
| 73 self.id | |
| 74 ]) | |
| 75 end | |
| 76 | |
| 77 after_save :update_linked_line | |
| 78 | |
| 79 def paginate_matches(scope, min_match, page, per_page) | |
| 80 | |
| 81 match_sql = | |
| 82 'SELECT calls.*, ' + | |
| 83 " (( icount(ARRAY[?]::int[] & calls.fprint::int[]) / icount(ARRAY… | |
| 84 'FROM calls ' + | |
| 85 'WHERE icount(calls.fprint) > 0 AND ' | |
| 86 args = [fprint, fprint] | |
| 87 | |
| 88 case scope | |
| 89 when 'job' | |
| 90 match_sql << " calls.job_id = ? AND " | |
| 91 args << job.id.to_i | |
| 92 when 'project' | |
| 93 match_sql << " calls.project_id = ? AND " | |
| 94 args << project_id.to_i | |
| 95 end | |
| 96 | |
| 97 match_sql << "calls.id != ? " | |
| 98 args << self.id | |
| 99 | |
| 100 match_sql << " AND (( icount(ARRAY[?]::int[] & calls.fprint::int[]) … | |
| 101 args << fprint | |
| 102 args << fprint | |
| 103 args << min_match.to_f | |
| 104 | |
| 105 query = [match_sql, *args] | |
| 106 Call.paginate_by_sql(query, page: page, per_page: per_page) | |
| 107 end | |
| 108 | |
| 109 def media | |
| 110 CallMedium.where(call_id: self.id, project_id: self.project_id).firs… | |
| 111 end | |
| 112 | |
| 113 def media_fields | |
| 114 CallMedium.columns_hash.keys.reject{|x| x =~ /^id|_id$/} | |
| 115 end | |
| 116 | |
| 117 def linked_line | |
| 118 Line.where(number: self.number, project_id: self.project_id).first_o… | |
| 119 end | |
| 120 | |
| 121 def update_linked_line | |
| 122 line = linked_line | |
| 123 | |
| 124 if self[:line_type] | |
| 125 line.line_type = self[:line_type] | |
| 126 line.save | |
| 127 end | |
| 128 end | |
| 129 | |
| 130 end |