caboose-rets 0.1.73 → 0.1.74

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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