caboose-rets 0.1.73 → 0.1.74

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 95bb28494c5e189c8b8bb15792ee867f6b7395414e4ef6a2e976a44080b4da41
4
- data.tar.gz: e33874162b9972150c71824e9d414e0ace454153ff4fd92a7f3ef8597a5b7750
3
+ metadata.gz: f2dddec676cb5213e2d840183472f60a617f5aeaa0c1c79a81a046adaf83839a
4
+ data.tar.gz: 7170eeb154afa3d3e8ea529350e054b13d0daaf97cedec4e27e2031ea3bfd360
5
5
  SHA512:
6
- metadata.gz: 83a93608512e207552425757fe4026457ec8069571e049455edc1b3ffac31cd979d6f5cb3455183ef1ca5473e84e4a3486500fc150a787218230a234d0f5963d
7
- data.tar.gz: 6e982a6f10469b82e51a6288f76fa44a7faa4b2c47f695a65a3e7c79b412ae179b42e867e47818713a9bb32ff88caf40393da4399f96e94fab6052c642644039
6
+ metadata.gz: 6dc6e4147c90ac16557f6d9d4adc4d32b41c3496d3109cd5f992858c8c68cfbf5511369c2d0cacdf69e6829acfb9ae46f5161499d3d8b9d00ca385265a96ead0
7
+ data.tar.gz: 79ba0e3691f6e0e8274b432ca6ea71fa5c4db697b3ecf6e17c88cb2dab13ff13695326f3a2c9ded9c1ab2661dcad8cfbfed815d79d339821ba9e63e478addd91
@@ -0,0 +1,6 @@
1
+ class CabooseRets::Log < ActiveRecord::Base
2
+ self.table_name = "rets_logs"
3
+
4
+ attr_accessible :id, :timestamp, :class_name, :object_id, :text
5
+
6
+ end
@@ -64,7 +64,7 @@ class CabooseRets::RetsImporter # < ActiveRecord::Base
64
64
 
65
65
  def self.import(class_type, query)
66
66
  m = self.meta(class_type)
67
- self.log("Importing #{m.search_type}:#{class_type} with query #{query}...")
67
+ self.log3(class_type,nil,"Importing #{m.search_type}:#{class_type} with query #{query}...")
68
68
  self.get_config if @@config.nil? || @@config['url'].nil?
69
69
  params = {
70
70
  :search_type => m.search_type,
@@ -79,16 +79,16 @@ class CabooseRets::RetsImporter # < ActiveRecord::Base
79
79
  self.client.search(params) do |data|
80
80
  obj = self.get_instance_with_id(class_type, data)
81
81
  if obj.nil?
82
- self.log("Error: object is nil")
83
- self.log(data.inspect)
82
+ self.log3(class_type,nil,"Error: object is nil")
83
+ self.log3(class_type,nil,data.inspect)
84
84
  next
85
85
  end
86
86
  obj.parse(data)
87
87
  obj.save
88
88
  end
89
89
  rescue RETS::HTTPError => err
90
- self.log "Import error for #{class_type}: #{query}"
91
- self.log err.message
90
+ self.log3(class_type,nil,"Import error for #{class_type}: #{query}")
91
+ self.log3(class_type,nil,err.message)
92
92
  end
93
93
  end
94
94
 
@@ -118,16 +118,17 @@ class CabooseRets::RetsImporter # < ActiveRecord::Base
118
118
  #=============================================================================
119
119
 
120
120
  def self.update_after(date_modified, save_images = true)
121
- self.log "Updating after #{date_modified}"
122
- self.delay(:priority => 10, :queue => 'rets').update_helper('Property' , date_modified, save_images)
121
+ si = save_images ? 'saving images' : 'not saving images'
122
+ self.log3(nil,nil,"Updating after #{date_modified} and #{si}")
123
+ self.delay(:priority => 10, :queue => 'rets').update_helper('Property' , date_modified, save_images)
123
124
  self.delay(:priority => 10, :queue => 'rets').update_helper('Office' , date_modified, false)
124
- self.delay(:priority => 10, :queue => 'rets').update_helper('Member' , date_modified, false)
125
+ self.delay(:priority => 10, :queue => 'rets').update_helper('Member' , date_modified, false)
125
126
  self.delay(:priority => 10, :queue => 'rets').update_helper('OpenHouse', date_modified, false)
126
127
  end
127
128
 
128
129
  def self.update_helper(class_type, date_modified, save_images = true)
129
- self.log "In update helper for #{class_type}"
130
- self.log "Updating everything modified after #{date_modified}"
130
+ #self.log3(class_type,nil,"In update helper for #{class_type}")
131
+ self.log3(class_type,nil,"Updating everything modified after #{date_modified}")
131
132
  m = self.meta(class_type)
132
133
  k = m.remote_key_field
133
134
  d = date_modified.in_time_zone(CabooseRets::timezone).strftime("%FT%T")
@@ -144,9 +145,9 @@ class CabooseRets::RetsImporter # < ActiveRecord::Base
144
145
  :standard_names_only => true,
145
146
  :timeout => -1
146
147
  }
147
- self.log(params)
148
+ self.log3(class_type,nil,"Searching with params: " + params.to_s)
148
149
  self.client.search(params) do |data|
149
- self.log data
150
+ self.log3(class_type,nil,"Resulting data: " + data.to_s)
150
151
  case class_type
151
152
  when 'Property' then self.delay(:priority => 10, :queue => 'rets').import_properties(data[k], save_images)
152
153
  when 'Office' then self.delay(:priority => 10, :queue => 'rets').import_office( data[k], false)
@@ -172,31 +173,37 @@ class CabooseRets::RetsImporter # < ActiveRecord::Base
172
173
  # end
173
174
 
174
175
  def self.import_properties(mls_id, save_images = true)
176
+ si = save_images ? 'saving images' : 'not saving images'
177
+ self.log3('Property',mls_id,"Importing Property #{mls_id} and #{si}...")
175
178
  self.import('Property', "(ListingId=#{mls_id})")
176
179
  p = CabooseRets::Property.where(:mls_number => mls_id.to_s).first
177
180
  if p != nil
178
181
  self.download_property_images(p) if save_images
179
182
  self.update_coords(p)
180
183
  else
181
- self.log("No Property associated with #{mls_id}")
184
+ self.log3(nil,nil,"No Property associated with #{mls_id}")
182
185
  end
183
186
  end
184
187
 
185
188
  def self.import_office(mls_id, save_images = true)
189
+ self.log3('Office',mls_id,"Importing Office #{mls_id}...")
186
190
  self.import('Office', "(OfficeMlsId=#{mls_id})")
187
191
  office = CabooseRets::Office.where(:matrix_unique_id => mls_id.to_s).first
188
192
  end
189
193
 
190
194
  def self.import_agent(mls_id, save_images = true)
195
+ self.log3('Agent',mls_id,"Importing Agent #{mls_id}...")
191
196
  self.import('Member', "(MemberMlsId=#{mls_id})")
192
197
  a = CabooseRets::Agent.where(:mls_id => mls_id.to_s).first
193
198
  end
194
199
 
195
200
  def self.import_open_house(oh_id, save_images = true)
201
+ self.log3('OpenHouse',oh_id,"Importing Open House #{oh_id}...")
196
202
  self.import('OpenHouse', "(OpenHouseKey=#{oh_id})")
197
203
  end
198
204
 
199
205
  def self.import_media(id, save_images = true)
206
+ self.log3('Media',id,"Importing Media #{id}...")
200
207
  self.import('Media', "((MediaObjectID=#{id}+),(MediaObjectID=#{id}-))")
201
208
  end
202
209
 
@@ -243,7 +250,7 @@ class CabooseRets::RetsImporter # < ActiveRecord::Base
243
250
  # end
244
251
 
245
252
  def self.download_property_images(p)
246
- self.log "Saving images for #{p.mls_number}..."
253
+ self.log3('Property',p.mls_number,"Downloading images for #{p.mls_number}...")
247
254
  begin
248
255
  # Get first image
249
256
  self.client.get_object(:resource => 'Property', :type => 'Photo', :location=> false, :id => "#{p.matrix_unique_id}:0") do |headers, content|
@@ -296,6 +303,7 @@ class CabooseRets::RetsImporter # < ActiveRecord::Base
296
303
  end
297
304
 
298
305
  def self.download_missing_images
306
+ self.log3("Property",nil,"Downloading all missing images...")
299
307
  CabooseRets::Property.where("photo_count = ? OR photo_count is null", '').all.each do |p|
300
308
  self.delay(:priority => 10, :queue => 'rets').import_properties(p.mls_number, true)
301
309
  end
@@ -337,17 +345,17 @@ class CabooseRets::RetsImporter # < ActiveRecord::Base
337
345
  if p.nil?
338
346
  model = CabooseRets::Property
339
347
  i = 0
340
- self.log "Updating coords properties..."
348
+ self.log3('Property',nil,"Updating coords properties...")
341
349
  model.where(:latitude => nil).reorder(:mls_number).each do |p1|
342
350
  self.delay(:priority => 10, :queue => 'rets').update_coords(p1)
343
351
  end
344
352
  return
345
353
  end
346
354
 
347
- self.log "Getting coords for MLS # #{p.mls_number}..."
355
+ self.log3('Property',p.mls_number,"Getting coords for MLS # #{p.mls_number}...")
348
356
  coords = self.coords_from_address(CGI::escape "#{p.street_number} #{p.street_name}, #{p.city}, #{p.state_or_province} #{p.postal_code}")
349
357
  if coords.nil? || coords == false
350
- self.log "Can't set coords for MLS # #{p.mls_number}..."
358
+ self.log3('Property',nil,"Can't set coords for MLS # #{p.mls_number}...")
351
359
  return
352
360
  end
353
361
 
@@ -375,7 +383,7 @@ class CabooseRets::RetsImporter # < ActiveRecord::Base
375
383
  #=============================================================================
376
384
 
377
385
  def self.purge
378
- self.log('purging')
386
+ self.log3(nil,nil,'purging')
379
387
  self.purge_properties
380
388
  self.purge_offices
381
389
  self.purge_agents
@@ -392,10 +400,10 @@ class CabooseRets::RetsImporter # < ActiveRecord::Base
392
400
  m = self.meta(class_type)
393
401
  self.log(m.search_type)
394
402
 
395
- self.log("Purging #{class_type}...")
403
+ self.log3(class_type,nil,"Purging #{class_type}...")
396
404
 
397
405
  # Get the total number of records
398
- self.log("- Getting total number of records for #{class_type}...")
406
+ self.log3(class_type,nil,"Getting total number of records for #{class_type}...")
399
407
 
400
408
  statusquery = ""
401
409
 
@@ -421,7 +429,7 @@ class CabooseRets::RetsImporter # < ActiveRecord::Base
421
429
  ids = []
422
430
  k = m.remote_key_field
423
431
  (0...batch_count).each do |i|
424
- self.log("- Getting ids for #{class_type} (batch #{i+1} of #{batch_count})...")
432
+ self.log3(class_type,nil,"Getting ids for #{class_type} (batch #{i+1} of #{batch_count})...")
425
433
  self.client.search(params.merge({ :select => [k], :limit => 5000, :offset => 5000*i })) do |data|
426
434
  ids << (class_type == 'OpenHouse' ? data[k].to_i : data[k])
427
435
  end
@@ -430,33 +438,33 @@ class CabooseRets::RetsImporter # < ActiveRecord::Base
430
438
  # Only do stuff if we got a real response from the server
431
439
  if ids.count > 0
432
440
 
433
- puts "Remote IDs found: #{ids.to_s}"
441
+ self.log3(class_type,nil,"Remote IDs found: #{ids.to_s}")
434
442
 
435
443
  # Delete any records in the local database that shouldn't be there
436
- self.log("- Finding #{class_type} records in the local database that are not in the remote database...")
444
+ self.log3(class_type,nil,"Finding #{class_type} records in the local database that are not in the remote database...")
437
445
  t = m.local_table
438
446
  k = m.local_key_field
439
447
  query = "select distinct #{k} from #{t}"
440
448
  rows = ActiveRecord::Base.connection.select_all(ActiveRecord::Base.send(:sanitize_sql_array, query))
441
449
  local_ids = rows.collect{ |row| row[k] }
442
- puts "Local IDs found: #{local_ids.to_s}"
450
+ self.log3(class_type,nil,"Local IDs found: #{local_ids.to_s}")
443
451
  ids_to_remove = local_ids - ids
444
- self.log("- Found #{ids_to_remove.count} #{class_type} records in the local database that are not in the remote database.")
445
- self.log("- Deleting #{class_type} records in the local database that shouldn't be there...")
452
+ self.log3(class_type,nil,"Found #{ids_to_remove.count} #{class_type} records in the local database that are not in the remote database.")
453
+ self.log3(class_type,nil,"Deleting #{class_type} records in the local database that shouldn't be there...")
446
454
  query = ["delete from #{t} where #{k} in (?)", ids_to_remove]
447
455
  ActiveRecord::Base.connection.execute(ActiveRecord::Base.send(:sanitize_sql_array, query))
448
456
 
449
457
  # Find any ids in the remote database that should be in the local database
450
- self.log("- Finding #{class_type} records in the remote database that should be in the local database...")
458
+ self.log3(class_type,nil,"- Finding #{class_type} records in the remote database that should be in the local database...")
451
459
  query = "select distinct #{k} from #{t}"
452
460
  rows = ActiveRecord::Base.connection.select_all(ActiveRecord::Base.send(:sanitize_sql_array, query))
453
461
  local_ids = rows.collect{ |row| row[k] }
454
- puts "Local IDs found: #{local_ids.to_s}"
462
+ self.log3(class_type,nil,"Local IDs found: #{local_ids.to_s}")
455
463
  ids_to_add = ids - local_ids
456
464
  ids_to_add = ids_to_add.sort.reverse
457
- self.log("- Found #{ids_to_add.count} #{class_type} records in the remote database that we need to add to the local database.")
465
+ self.log3(class_type,nil,"Found #{ids_to_add.count} #{class_type} records in the remote database that we need to add to the local database.")
458
466
  ids_to_add.each do |id|
459
- self.log("- Importing #{id}...")
467
+ self.log3(class_type,nil,"Importing #{id}...")
460
468
  case class_type
461
469
  when "Property" then self.delay(:priority => 10, :queue => 'rets').import_properties(id, true)
462
470
  when "Office" then self.delay(:priority => 10, :queue => 'rets').import_office(id, false)
@@ -521,14 +529,22 @@ class CabooseRets::RetsImporter # < ActiveRecord::Base
521
529
 
522
530
  def self.log(msg)
523
531
  puts "[rets_importer] #{msg}"
524
- #Rails.logger.info("[rets_importer] #{msg}")
525
532
  end
526
533
 
527
534
  def self.log2(msg)
528
535
  puts "======================================================================"
529
536
  puts "[rets_importer] #{msg}"
530
537
  puts "======================================================================"
531
- #Rails.logger.info("[rets_importer] #{msg}")
538
+ end
539
+
540
+ def self.log3(class_name, object_id, text)
541
+ self.log2(text)
542
+ log = CabooseRets::Log.new
543
+ log.class_name = class_name
544
+ log.object_id = object_id
545
+ log.text = text
546
+ log.timestamp = DateTime.now
547
+ log.save
532
548
  end
533
549
 
534
550
  #=============================================================================
@@ -536,7 +552,7 @@ class CabooseRets::RetsImporter # < ActiveRecord::Base
536
552
  #=============================================================================
537
553
 
538
554
  def self.update_rets
539
- self.log2("Updating rets...")
555
+ self.log3(nil,nil,"Updating rets...")
540
556
  if self.task_is_locked
541
557
  self.log2("Task is locked, aborting.")
542
558
  return
@@ -545,20 +561,16 @@ class CabooseRets::RetsImporter # < ActiveRecord::Base
545
561
  task_started = self.lock_task
546
562
 
547
563
  begin
548
- overlap = 30.seconds
564
+ overlap = 24.hours
549
565
  if (DateTime.now - self.last_purged).to_f >= 0.5
550
566
  self.purge
551
567
  self.save_last_purged(task_started)
552
- # Keep this in here to make sure all updates are caught
553
- #overlap = 1.month
568
+ overlap = 1.week
554
569
  end
555
-
556
- self.log2("Updating after #{self.last_updated.strftime("%FT%T%:z")}...")
557
570
  self.update_after(self.last_updated - overlap)
558
571
  self.download_missing_images
559
- self.log2("Saving the timestamp for when we updated...")
572
+ self.log3(nil,nil,"Saving the timestamp for when we updated to #{task_started.to_s}...")
560
573
  self.save_last_updated(task_started)
561
-
562
574
  self.log2("Unlocking the task...")
563
575
  self.unlock_task
564
576
  rescue Exception => err
@@ -570,12 +582,14 @@ class CabooseRets::RetsImporter # < ActiveRecord::Base
570
582
  end
571
583
 
572
584
  # Start the same update process in 20 minutes
573
- self.log2("Adding the update rets task for 20 minutes from now...")
585
+ self.log3(nil,nil,"Adding the update rets task for 20 minutes from now...")
574
586
  q = "handler like '%update_rets%'"
575
587
  count = Delayed::Job.where(q).count
576
588
  if count == 0 || (count == 1 && Delayed::Job.where(q).first.locked_at)
577
589
  self.delay(:run_at => 20.minutes.from_now, :priority => 10, :queue => 'rets').update_rets
578
590
  end
591
+ # Delete old logs
592
+ CabooseRets::Log.where("timestamp < ?",(DateTime.now - 30.days)).destroy_all
579
593
  end
580
594
 
581
595
  def self.last_updated
@@ -290,7 +290,13 @@ class CabooseRets::Schema < Caboose::Utilities::Schema
290
290
  [ :zoning , :text],
291
291
  [ :zoning_northport , :text],
292
292
  [ :zoning_tusc , :text]
293
- ],
293
+ ],
294
+ CabooseRets::Log => [
295
+ [ :class_name, :string ],
296
+ [ :object_id, :string ],
297
+ [ :text, :text ],
298
+ [ :timestamp, :datetime ]
299
+ ],
294
300
  CabooseRets::Media => [
295
301
  [ :photo_modification_timestamp , :string ],
296
302
  [ :file_name , :string ],
@@ -1,3 +1,3 @@
1
1
  module CabooseRets
2
- VERSION = '0.1.73'
2
+ VERSION = '0.1.74'
3
3
  end
@@ -13,7 +13,14 @@ namespace :caboose_rets do
13
13
  desc "Do a simple search"
14
14
  task :simple_search => :environment do
15
15
  type = ['p','a','o','oh']
16
- @@config = nil
16
+ @@config = {
17
+ 'url' => nil,
18
+ 'username' => nil,
19
+ 'password' => nil,
20
+ 'temp_path' => nil,
21
+ 'log_file' => nil,
22
+ 'media_base_url' => nil
23
+ }
17
24
  config = YAML::load(File.open("#{Rails.root}/config/rets_importer.yml"))
18
25
  config = config[Rails.env]
19
26
  config.each { |key,val| @@config[key] = val }
@@ -62,6 +69,62 @@ namespace :caboose_rets do
62
69
  end
63
70
  end
64
71
 
72
+ desc "Inspect object"
73
+ task :inspect, [:search_type, :query] => :environment do |t, args|
74
+ @@config = {
75
+ 'url' => nil,
76
+ 'username' => nil,
77
+ 'password' => nil,
78
+ 'temp_path' => nil,
79
+ 'log_file' => nil,
80
+ 'media_base_url' => nil
81
+ }
82
+ config = YAML::load(File.open("#{Rails.root}/config/rets_importer.yml"))
83
+ config = config[Rails.env]
84
+ config.each { |key,val| @@config[key] = val }
85
+ client = RETS::Client.login(
86
+ :url => config['url'],
87
+ :username => config['username'],
88
+ :password => config['password']
89
+ )
90
+ if args.search_type == 'Property'
91
+ params = {
92
+ :search_type => 'Property',
93
+ :class => 'Property',
94
+ :query => "(ListingId=#{args.query})",
95
+ :limit => 1,
96
+ :timeout => -1
97
+ }
98
+ elsif args.search_type == 'Agent'
99
+ params = {
100
+ :search_type => 'Member',
101
+ :class => 'Member',
102
+ :query => "(MemberMlsId=#{args.query})",
103
+ :limit => 1,
104
+ :timeout => -1
105
+ }
106
+ elsif args.search_type == 'Office'
107
+ params = {
108
+ :search_type => 'Office',
109
+ :class => 'Office',
110
+ :query => "(OfficeMlsId=#{args.query})",
111
+ :limit => 1,
112
+ :timeout => -1
113
+ }
114
+ elsif args.search_type == 'OpenHouse'
115
+ params = {
116
+ :search_type => 'OpenHouse',
117
+ :class => 'OpenHouse',
118
+ :query => "(OpenHouseKey=#{args.query})",
119
+ :limit => 1,
120
+ :timeout => -1
121
+ }
122
+ end
123
+ client.search(params) do |data|
124
+ ap data
125
+ end
126
+ end
127
+
65
128
  desc "Import Image"
66
129
  task :img => :environment do
67
130
  CabooseRets::RetsImporter.download_missing_images
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: caboose-rets
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.73
4
+ version: 0.1.74
5
5
  platform: ruby
6
6
  authors:
7
7
  - William Barry
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-20 00:00:00.000000000 Z
11
+ date: 2018-12-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: caboose-cms
@@ -48,6 +48,7 @@ files:
48
48
  - app/helpers/caboose_rets/application_helper.rb
49
49
  - app/models/caboose_rets/agent.rb
50
50
  - app/models/caboose_rets/agent_meta.rb
51
+ - app/models/caboose_rets/log.rb
51
52
  - app/models/caboose_rets/media.rb
52
53
  - app/models/caboose_rets/office.rb
53
54
  - app/models/caboose_rets/office_meta.rb