caboose-rets 0.1.151 → 0.1.152
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 +4 -4
- data/app/models/caboose_rets/agent.rb +1 -1
- data/app/models/caboose_rets/agent_meta.rb +10 -10
- data/app/models/caboose_rets/log.rb +1 -1
- data/app/models/caboose_rets/media.rb +1 -1
- data/app/models/caboose_rets/office.rb +1 -1
- data/app/models/caboose_rets/office_meta.rb +1 -1
- data/app/models/caboose_rets/open_house.rb +1 -1
- data/app/models/caboose_rets/property.rb +1 -1
- data/app/models/caboose_rets/rets_config.rb +10 -10
- data/app/models/caboose_rets/saved_property.rb +1 -1
- data/app/models/caboose_rets/saved_search.rb +1 -1
- data/app/models/caboose_rets/search_option.rb +1 -1
- data/lib/caboose_rets/version.rb +1 -1
- metadata +2 -4
- data/app/models/caboose_rets/rets_importer_bak.rb +0 -621
- data/app/models/caboose_rets/rets_importer_old.rb +0 -625
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4d5ec012cb67ab91bedbb490acad5761f23a2c0f49646efd16a3890e14d0076
|
4
|
+
data.tar.gz: 6916cca55464a24daa270209aa34a2945c88bbff34e25857de75bd7c29629921
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 51428fa52eb6c598aec5e26bef729932fcf18b34c181a968f59bf1348af2f8d99df272634f3161d421d100ed2df5d73075c485973134d3e3e2f98e08280d818d
|
7
|
+
data.tar.gz: a59f85fd153c744e06c50f97fdcc0c5de2b44621902e1bd42a8ab3be0881a3f9d6f94d3a1fffa40c78fc05f9214214f7992faad7d8cc80a4d12a83ba129bc655
|
@@ -3,7 +3,7 @@ class CabooseRets::Agent < ActiveRecord::Base
|
|
3
3
|
|
4
4
|
has_one :meta, :class_name => 'AgentMeta', :primary_key => 'mls_id', :foreign_key => 'la_code'
|
5
5
|
has_many :properties
|
6
|
-
attr_accessible :id, :agent_number, :matrix_unique_id, :sort_order, :mls_id, :last_updated
|
6
|
+
# attr_accessible :id, :agent_number, :matrix_unique_id, :sort_order, :mls_id, :last_updated
|
7
7
|
after_initialize :fix_name
|
8
8
|
|
9
9
|
def image
|
@@ -10,15 +10,15 @@ class CabooseRets::AgentMeta < ActiveRecord::Base
|
|
10
10
|
:large => '900x900>'
|
11
11
|
}
|
12
12
|
do_not_validate_attachment_file_type :image
|
13
|
-
attr_accessible :id,
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
13
|
+
# attr_accessible :id,
|
14
|
+
# :la_code ,
|
15
|
+
# :hide ,
|
16
|
+
# :bio ,
|
17
|
+
# :contact_info ,
|
18
|
+
# :assistant_to ,
|
19
|
+
# :designation ,
|
20
|
+
# :image_location ,
|
21
|
+
# :accepts_listings,
|
22
|
+
# :weight
|
23
23
|
|
24
24
|
end
|
@@ -13,7 +13,7 @@ class CabooseRets::Media < ActiveRecord::Base
|
|
13
13
|
:huge => '1200x1200>'
|
14
14
|
}
|
15
15
|
do_not_validate_attachment_file_type :image
|
16
|
-
attr_accessible :date_modified, :file_name, :media_id, :media_order, :media_remarks, :media_type, :mls, :url
|
16
|
+
# attr_accessible :date_modified, :file_name, :media_id, :media_order, :media_remarks, :media_type, :mls, :url
|
17
17
|
|
18
18
|
def parse(data,content)
|
19
19
|
# self.date_modified = data['DATE_MODIFIED']
|
@@ -3,7 +3,7 @@ class CabooseRets::Office < ActiveRecord::Base
|
|
3
3
|
self.table_name = "rets_offices"
|
4
4
|
|
5
5
|
has_one :meta, :primary_key => 'matrix_unique_id', :foreign_key => 'matrix_unique_id'
|
6
|
-
attr_accessible :id, :name, :lo_mls_id, :matrix_unique_id
|
6
|
+
# attr_accessible :id, :name, :lo_mls_id, :matrix_unique_id
|
7
7
|
|
8
8
|
def image
|
9
9
|
return nil if self.meta.nil?
|
@@ -3,7 +3,7 @@ class CabooseRets::OpenHouse < ActiveRecord::Base
|
|
3
3
|
self.table_name = "rets_open_houses"
|
4
4
|
|
5
5
|
has_one :property, :primary_key => 'listing_mui', :foreign_key => 'mls_number'
|
6
|
-
attr_accessible :id, :matrix_unique_id, :hide
|
6
|
+
# attr_accessible :id, :matrix_unique_id, :hide
|
7
7
|
|
8
8
|
# def property
|
9
9
|
# models = [CabooseRets::Property]
|
@@ -3,15 +3,15 @@ class CabooseRets::RetsConfig < ActiveRecord::Base
|
|
3
3
|
|
4
4
|
belongs_to :site, :class_name => 'Caboose::Site'
|
5
5
|
|
6
|
-
attr_accessible :id,
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
6
|
+
# attr_accessible :id,
|
7
|
+
# :site_id,
|
8
|
+
# :office_mls,
|
9
|
+
# :office_mui,
|
10
|
+
# :agent_mls,
|
11
|
+
# :agent_mui,
|
12
|
+
# :rets_url,
|
13
|
+
# :rets_username,
|
14
|
+
# :rets_password,
|
15
|
+
# :default_sort
|
16
16
|
|
17
17
|
end
|
@@ -2,7 +2,7 @@ class CabooseRets::SavedProperty < ActiveRecord::Base
|
|
2
2
|
self.table_name = "rets_saved_properties"
|
3
3
|
|
4
4
|
belongs_to :user, :class_name => 'Caboose::User'
|
5
|
-
attr_accessible :user_id, :mls_number, :date_saved
|
5
|
+
# attr_accessible :user_id, :mls_number, :date_saved
|
6
6
|
|
7
7
|
def property
|
8
8
|
return CabooseRets::Property.where(:mls_number => self.mls_number).first
|
@@ -2,7 +2,7 @@ class CabooseRets::SavedSearch < ActiveRecord::Base
|
|
2
2
|
self.table_name = 'rets_saved_searches'
|
3
3
|
|
4
4
|
belongs_to :user
|
5
|
-
attr_accessible :id, :user_id, :property_type, :uri, :params, :date_last, :interval, :notify
|
5
|
+
# attr_accessible :id, :user_id, :property_type, :uri, :params, :date_last, :interval, :notify
|
6
6
|
|
7
7
|
# We're storing the params as JSON, so parse it when we init
|
8
8
|
after_initialize do
|
data/lib/caboose_rets/version.rb
CHANGED
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.
|
4
|
+
version: 0.1.152
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- William Barry
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-03-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: caboose-cms
|
@@ -77,8 +77,6 @@ files:
|
|
77
77
|
- app/models/caboose_rets/property.rb
|
78
78
|
- app/models/caboose_rets/rets_config.rb
|
79
79
|
- app/models/caboose_rets/rets_importer.rb
|
80
|
-
- app/models/caboose_rets/rets_importer_bak.rb
|
81
|
-
- app/models/caboose_rets/rets_importer_old.rb
|
82
80
|
- app/models/caboose_rets/rets_plugin.rb
|
83
81
|
- app/models/caboose_rets/saved_property.rb
|
84
82
|
- app/models/caboose_rets/saved_search.rb
|
@@ -1,621 +0,0 @@
|
|
1
|
-
##require 'ruby-rets'
|
2
|
-
#require "rets/version"
|
3
|
-
#require "rets/exceptions"
|
4
|
-
#require "rets/client"
|
5
|
-
#require "rets/http"
|
6
|
-
#require "rets/stream_http"
|
7
|
-
#require "rets/base/core"
|
8
|
-
#require "rets/base/sax_search"
|
9
|
-
#require "rets/base/sax_metadata"
|
10
|
-
#
|
11
|
-
#require 'httparty'
|
12
|
-
#require 'json'
|
13
|
-
#
|
14
|
-
## http://rets.solidearth.com/ClientHome.aspx
|
15
|
-
#
|
16
|
-
#class CabooseRets::RetsImporter # < ActiveRecord::Base
|
17
|
-
#
|
18
|
-
# @@rets_client = nil
|
19
|
-
# @@config = nil
|
20
|
-
#
|
21
|
-
# def self.config
|
22
|
-
# return @@config
|
23
|
-
# end
|
24
|
-
#
|
25
|
-
# def self.get_config
|
26
|
-
# @@config = {
|
27
|
-
# 'url' => nil, # URL to the RETS login
|
28
|
-
# 'username' => nil,
|
29
|
-
# 'password' => nil,
|
30
|
-
# 'temp_path' => nil,
|
31
|
-
# 'log_file' => nil,
|
32
|
-
# 'media_base_url' => nil
|
33
|
-
# }
|
34
|
-
# config = YAML::load(File.open("#{Rails.root}/config/rets_importer.yml"))
|
35
|
-
# config = config[Rails.env]
|
36
|
-
# config.each { |key,val| @@config[key] = val }
|
37
|
-
# end
|
38
|
-
#
|
39
|
-
# def self.client
|
40
|
-
# self.get_config if @@config.nil? || @@config['url'].nil?
|
41
|
-
#
|
42
|
-
# if @@rets_client.nil?
|
43
|
-
# @@rets_client = RETS::Client.login(
|
44
|
-
# :url => @@config['url'],
|
45
|
-
# :username => @@config['username'],
|
46
|
-
# :password => @@config['password']
|
47
|
-
# )
|
48
|
-
# end
|
49
|
-
# return @@rets_client
|
50
|
-
# end
|
51
|
-
#
|
52
|
-
# def self.meta(class_type)
|
53
|
-
# case class_type
|
54
|
-
# when 'RES' then Caboose::StdClass.new({ :search_type => 'Property' , :remote_key_field => 'MLS' , :local_key_field => 'mls' , :local_table => 'rets_residential' , :date_modified_field => 'DATE_MODIFIED' })
|
55
|
-
# when 'COM' then Caboose::StdClass.new({ :search_type => 'Property' , :remote_key_field => 'MLS' , :local_key_field => 'mls' , :local_table => 'rets_commercial' , :date_modified_field => 'DATE_MODIFIED' })
|
56
|
-
# when 'LND' then Caboose::StdClass.new({ :search_type => 'Property' , :remote_key_field => 'MLS' , :local_key_field => 'mls' , :local_table => 'rets_land' , :date_modified_field => 'DATE_MODIFIED' })
|
57
|
-
# when 'MUL' then Caboose::StdClass.new({ :search_type => 'Property' , :remote_key_field => 'MLS' , :local_key_field => 'mls' , :local_table => 'rets_multi_family' , :date_modified_field => 'DATE_MODIFIED' })
|
58
|
-
# when 'OFF' then Caboose::StdClass.new({ :search_type => 'Office' , :remote_key_field => 'LO_LO_CODE' , :local_key_field => 'lo_code' , :local_table => 'rets_offices' , :date_modified_field => 'LO_DATE_MODIFIED' })
|
59
|
-
# when 'AGT' then Caboose::StdClass.new({ :search_type => 'Agent' , :remote_key_field => 'LA_LA_CODE' , :local_key_field => 'la_code' , :local_table => 'rets_agents' , :date_modified_field => 'LA_DATE_MODIFIED' })
|
60
|
-
# when 'OPH' then Caboose::StdClass.new({ :search_type => 'OpenHouse' , :remote_key_field => 'ID' , :local_key_field => 'id' , :local_table => 'rets_open_houses' , :date_modified_field => 'DATE_MODIFIED' })
|
61
|
-
# when 'GFX' then Caboose::StdClass.new({ :search_type => 'Media' , :remote_key_field => 'MEDIA_ID' , :local_key_field => 'media_id' , :local_table => 'rets_media' , :date_modified_field => 'DATE_MODIFIED' })
|
62
|
-
# end
|
63
|
-
# end
|
64
|
-
#
|
65
|
-
# #=============================================================================
|
66
|
-
# # Import method
|
67
|
-
# #=============================================================================
|
68
|
-
#
|
69
|
-
# def self.import(class_type, query)
|
70
|
-
# m = self.meta(class_type)
|
71
|
-
# self.log("Importing #{m.search_type}:#{class_type} with query #{query}...")
|
72
|
-
# self.get_config if @@config.nil? || @@config['url'].nil?
|
73
|
-
# params = {
|
74
|
-
# :search_type => m.search_type,
|
75
|
-
# :class => class_type,
|
76
|
-
# :query => query,
|
77
|
-
# :limit => -1,
|
78
|
-
# :timeout => -1
|
79
|
-
# }
|
80
|
-
# obj = nil
|
81
|
-
# begin
|
82
|
-
# self.client.search(params) do |data|
|
83
|
-
# obj = self.get_instance_with_id(class_type, data)
|
84
|
-
# if obj.nil?
|
85
|
-
# self.log("Error: object is nil")
|
86
|
-
# self.log(data.inspect)
|
87
|
-
# next
|
88
|
-
# end
|
89
|
-
# obj.parse(data)
|
90
|
-
# obj.save
|
91
|
-
# end
|
92
|
-
# rescue RETS::HTTPError => err
|
93
|
-
# self.log "Import error for #{class_type}: #{query}"
|
94
|
-
# self.log err.message
|
95
|
-
# end
|
96
|
-
#
|
97
|
-
# end
|
98
|
-
#
|
99
|
-
# def self.get_instance_with_id(class_type, data)
|
100
|
-
# obj = nil
|
101
|
-
# m = case class_type
|
102
|
-
# when 'OPH' then CabooseRets::OpenHouse
|
103
|
-
# when 'GFX' then CabooseRets::Media
|
104
|
-
# when 'COM' then CabooseRets::CommercialProperty
|
105
|
-
# when 'LND' then CabooseRets::LandProperty
|
106
|
-
# when 'MUL' then CabooseRets::MultiFamilyProperty
|
107
|
-
# when 'RES' then CabooseRets::ResidentialProperty
|
108
|
-
# when 'AGT' then CabooseRets::Agent
|
109
|
-
# when 'OFF' then CabooseRets::Office
|
110
|
-
# end
|
111
|
-
# obj = case class_type
|
112
|
-
# when 'OPH' then m.where(:id => data['ID'].to_i ).exists? ? m.where(:id => data['ID'].to_i ).first : m.new(:id => data['ID'].to_i )
|
113
|
-
# when 'GFX' then m.where(:media_id => data['MEDIA_ID'] ).exists? ? m.where(:media_id => data['MEDIA_ID'] ).first : m.new(:media_id => data['MEDIA_ID'] )
|
114
|
-
# when 'COM' then m.where(:id => data['MLS'].to_i ).exists? ? m.where(:id => data['MLS'].to_i ).first : m.new(:id => data['MLS'].to_i )
|
115
|
-
# when 'LND' then m.where(:id => data['MLS'].to_i ).exists? ? m.where(:id => data['MLS'].to_i ).first : m.new(:id => data['MLS'].to_i )
|
116
|
-
# when 'MUL' then m.where(:id => data['MLS'].to_i ).exists? ? m.where(:id => data['MLS'].to_i ).first : m.new(:id => data['MLS'].to_i )
|
117
|
-
# when 'RES' then m.where(:id => data['MLS'].to_i ).exists? ? m.where(:id => data['MLS'].to_i ).first : m.new(:id => data['MLS'].to_i )
|
118
|
-
# when 'AGT' then m.where(:la_code => data['LA_LA_CODE'] ).exists? ? m.where(:la_code => data['LA_LA_CODE'] ).first : m.new(:la_code => data['LA_LA_CODE'] )
|
119
|
-
# when 'OFF' then m.where(:lo_code => data['LO_LO_CODE'] ).exists? ? m.where(:lo_code => data['LO_LO_CODE'] ).first : m.new(:lo_code => data['LO_LO_CODE'] )
|
120
|
-
# end
|
121
|
-
# return obj
|
122
|
-
# end
|
123
|
-
#
|
124
|
-
# #=============================================================================
|
125
|
-
# # Main updater
|
126
|
-
# #=============================================================================
|
127
|
-
#
|
128
|
-
# def self.update_after(date_modified, save_images = true)
|
129
|
-
# self.update_helper('RES', date_modified, save_images)
|
130
|
-
# self.update_helper('COM', date_modified, save_images)
|
131
|
-
# self.update_helper('LND', date_modified, save_images)
|
132
|
-
# self.update_helper('MUL', date_modified, save_images)
|
133
|
-
# self.update_helper('OFF', date_modified, save_images)
|
134
|
-
# self.update_helper('AGT', date_modified, save_images)
|
135
|
-
# self.update_helper('OPH', date_modified, save_images)
|
136
|
-
# end
|
137
|
-
#
|
138
|
-
# def self.update_helper(class_type, date_modified, save_images = true)
|
139
|
-
# m = self.meta(class_type)
|
140
|
-
# k = m.remote_key_field
|
141
|
-
# params = {
|
142
|
-
# :search_type => m.search_type,
|
143
|
-
# :class => class_type,
|
144
|
-
# :select => [m.remote_key_field],
|
145
|
-
# :query => "(#{m.date_modified_field}=#{date_modified.strftime("%FT%T")}+)",
|
146
|
-
# :standard_names_only => true,
|
147
|
-
# :timeout => -1
|
148
|
-
# }
|
149
|
-
# self.client.search(params) do |data|
|
150
|
-
# case class_type
|
151
|
-
# when 'RES' then self.delay(:priority => 10).import_residential_property( data[k], save_images)
|
152
|
-
# when 'COM' then self.delay(:priority => 10).import_commercial_property( data[k], save_images)
|
153
|
-
# when 'LND' then self.delay(:priority => 10).import_land_property( data[k], save_images)
|
154
|
-
# when 'MUL' then self.delay(:priority => 10).import_multi_family_property( data[k], save_images)
|
155
|
-
# when 'OFF' then self.delay(:priority => 10).import_office( data[k], save_images)
|
156
|
-
# when 'AGT' then self.delay(:priority => 10).import_agent( data[k], save_images)
|
157
|
-
# when 'OPH' then self.delay(:priority => 10).import_open_house( data[k], save_images)
|
158
|
-
# end
|
159
|
-
# end
|
160
|
-
# end
|
161
|
-
#
|
162
|
-
# #=============================================================================
|
163
|
-
# # Single model import methods (called from a worker dyno)
|
164
|
-
# #=============================================================================
|
165
|
-
#
|
166
|
-
# def self.import_property(mls, save_images = true)
|
167
|
-
# self.import('RES', "(MLS=*#{mls}*)")
|
168
|
-
# p = CabooseRets::ResidentialProperty.where(:id => mls.to_i).first
|
169
|
-
# if p.nil?
|
170
|
-
# self.import('COM', "(MLS=*#{mls}*)")
|
171
|
-
# p = CabooseRets::CommercialProperty.where(:id => mls.to_i).first
|
172
|
-
# if p.nil?
|
173
|
-
# self.import('LND', "(MLS=*#{mls}*)")
|
174
|
-
# p = CabooseRets::LandProperty.where(:id => mls.to_i).first
|
175
|
-
# if p.nil?
|
176
|
-
# self.import('MUL', "(MLS=*#{mls}*)")
|
177
|
-
# p = CabooseRets::MultiFamilyProperty.where(:id => mls.to_i).first
|
178
|
-
# return if p.nil?
|
179
|
-
# end
|
180
|
-
# end
|
181
|
-
# end
|
182
|
-
# self.download_property_images(p, save_images)
|
183
|
-
# end
|
184
|
-
#
|
185
|
-
# def self.import_residential_property(mls, save_images = true)
|
186
|
-
# self.import('RES', "(MLS=*#{mls}*)")
|
187
|
-
# p = CabooseRets::ResidentialProperty.where(:id => mls.to_i).first
|
188
|
-
# self.download_property_images(p, save_images)
|
189
|
-
# self.update_coords(p)
|
190
|
-
# end
|
191
|
-
#
|
192
|
-
# def self.import_commercial_property(mls, save_images = true)
|
193
|
-
# self.import('COM', "(MLS=*#{mls}*)")
|
194
|
-
# p = CabooseRets::CommercialProperty.where(:id => mls.to_i).first
|
195
|
-
# self.download_property_images(p, save_images)
|
196
|
-
# self.update_coords(p)
|
197
|
-
# end
|
198
|
-
#
|
199
|
-
# def self.import_land_property(mls, save_images = true)
|
200
|
-
# self.import('LND', "(MLS=*#{mls}*)")
|
201
|
-
# p = CabooseRets::LandProperty.where(:id => mls.to_i).first
|
202
|
-
# self.download_property_images(p, save_images)
|
203
|
-
# self.update_coords(p)
|
204
|
-
# end
|
205
|
-
#
|
206
|
-
# def self.import_multi_family_property(mls, save_images = true)
|
207
|
-
# self.import('MUL', "(MLS=*#{mls}*)")
|
208
|
-
# p = CabooseRets::MultiFamilyProperty.where(:id => mls.to_i).first
|
209
|
-
# self.download_property_images(p, save_images)
|
210
|
-
# self.update_coords(p)
|
211
|
-
# end
|
212
|
-
#
|
213
|
-
# def self.import_office(lo_code, save_images = true)
|
214
|
-
# self.import('OFF', "(LO_LO_CODE=*#{lo_code}*)")
|
215
|
-
# office = CabooseRets::Office.where(:lo_code => lo_code.to_s).first
|
216
|
-
# self.download_office_image(office) if save_images == true
|
217
|
-
# end
|
218
|
-
#
|
219
|
-
# def self.import_agent(la_code, save_images = true)
|
220
|
-
# self.import('AGT', "(LA_LA_CODE=*#{la_code}*)")
|
221
|
-
# a = CabooseRets::Agent.where(:la_code => la_code.to_s).first
|
222
|
-
# self.download_agent_image(a) if save_images == true
|
223
|
-
# end
|
224
|
-
#
|
225
|
-
# def self.import_open_house(id, save_images = true)
|
226
|
-
# self.import('OPH', "((ID=#{id}+),(ID=#{id}-))")
|
227
|
-
# end
|
228
|
-
#
|
229
|
-
# def self.import_media(id, save_images = true)
|
230
|
-
# self.import('GFX', "((MEDIA_ID=#{id}+),(MEDIA_ID=#{id}-))")
|
231
|
-
# #m = CabooseRets::Media.where(:media_id => id.to_s).first
|
232
|
-
# #if m.nil?
|
233
|
-
# # self.log("Can't find media record for #{id}.")
|
234
|
-
# # return
|
235
|
-
# #end
|
236
|
-
# #self.client.get_object(:resource => :Property, :type => :Photo, :location => true, :id => m.mls) do |headers, content|
|
237
|
-
# # if headers['object-id'].to_i == m.media_order
|
238
|
-
# # m.url = headers['location']
|
239
|
-
# # #m.image = URI.parse(headers['location'])
|
240
|
-
# # end
|
241
|
-
# #end
|
242
|
-
# #m.save
|
243
|
-
# end
|
244
|
-
#
|
245
|
-
# #=============================================================================
|
246
|
-
# # Images
|
247
|
-
# #=============================================================================
|
248
|
-
#
|
249
|
-
# def self.download_property_images(p, save_images = true)
|
250
|
-
# return if save_images == false
|
251
|
-
# self.refresh_property_media(p)
|
252
|
-
#
|
253
|
-
# #self.log("-- Downloading images and resizing for #{p.mls}")
|
254
|
-
# #media = []
|
255
|
-
# #self.client.get_object(:resource => :Property, :type => :Photo, :location => true, :id => p.id) do |headers, content|
|
256
|
-
# #
|
257
|
-
# # # Find the associated media record for the image
|
258
|
-
# # #filename = File.basename(headers['location'])
|
259
|
-
# # #m = CabooseRets::Media.where(:mls => p.mls, :file_name => filename).first
|
260
|
-
# # m = CabooseRets::Media.where(:mls => p.mls, :media_order => headers['object-id'].to_i).first
|
261
|
-
# #
|
262
|
-
# # if m.nil?
|
263
|
-
# # self.log("Can't find media record for #{p.mls} #{filename}.")
|
264
|
-
# # else
|
265
|
-
# # m.url = headers['location']
|
266
|
-
# # #m.image = URI.parse(headers['location'])
|
267
|
-
# # media << m
|
268
|
-
# # #m.save
|
269
|
-
# # end
|
270
|
-
# #end
|
271
|
-
# #
|
272
|
-
# #self.log("-- Uploading images to S3 for #{p.mls}")
|
273
|
-
# #media.each do |m|
|
274
|
-
# # m.save
|
275
|
-
# #end
|
276
|
-
# end
|
277
|
-
#
|
278
|
-
# def self.refresh_property_media(p)
|
279
|
-
# #self.log("-- Deleting images and metadata for #{p.mls}...")
|
280
|
-
# #CabooseRets::Media.where(:mls => p.mls, :media_type => 'Photo').destroy_all
|
281
|
-
# #CabooseRets::Media.where(:mls => p.mls).destroy_all
|
282
|
-
#
|
283
|
-
# self.log("-- Downloading GFX records for #{p.mls}...")
|
284
|
-
# params = {
|
285
|
-
# :search_type => 'Media',
|
286
|
-
# :class => 'GFX',
|
287
|
-
# :query => "(MLS=*#{p.id}*)",
|
288
|
-
# :timeout => -1
|
289
|
-
# }
|
290
|
-
# ids = []
|
291
|
-
# self.client.search(params) do |data|
|
292
|
-
# ids << data['MEDIA_ID']
|
293
|
-
# m = CabooseRets::Media.new
|
294
|
-
# m.parse(data)
|
295
|
-
# m.save
|
296
|
-
# end
|
297
|
-
#
|
298
|
-
# # Delete any records in the local database that shouldn't be there
|
299
|
-
# puts "- Finding GFX records for MLS ##{p.mls} in the local database that are not in the remote database..."
|
300
|
-
# query = "select media_id from rets_media where mls = '#{p.mls}'"
|
301
|
-
# rows = ActiveRecord::Base.connection.select_all(ActiveRecord::Base.send(:sanitize_sql_array, query))
|
302
|
-
# local_ids = rows.collect{ |row| row[k] }
|
303
|
-
# ids_to_remove = local_ids - ids
|
304
|
-
# if ids_to_remove && ids_to_remove > 0
|
305
|
-
# query = ["delete from rets_media where media_id not in (?)", ids_to_remove]
|
306
|
-
# ActiveRecord::Base.connection.execute(ActiveRecord::Base.send(:sanitize_sql_array, query))
|
307
|
-
# end
|
308
|
-
#
|
309
|
-
# end
|
310
|
-
#
|
311
|
-
# #def self.download_agent_image(agent)
|
312
|
-
# # self.log "Saving image for #{agent.first_name} #{agent.last_name}..."
|
313
|
-
# # begin
|
314
|
-
# # self.client.get_object(:resource => :Agent, :type => :Photo, :location => true, :id => agent.la_code) do |headers, content|
|
315
|
-
# # puts headers.inspect
|
316
|
-
# # agent.image = URI.parse(headers['location'])
|
317
|
-
# # agent.save
|
318
|
-
# # end
|
319
|
-
# # rescue RETS::APIError => err
|
320
|
-
# # self.log "No image for #{agent.first_name} #{agent.last_name}."
|
321
|
-
# # end
|
322
|
-
# #end
|
323
|
-
#
|
324
|
-
# #def self.download_office_image(office)
|
325
|
-
# # self.log "Saving image for #{office.lo_name}..."
|
326
|
-
# # begin
|
327
|
-
# # self.client.get_object(:resource => :Office, :type => :Photo, :location => true, :id => office.lo_code) do |headers, content|
|
328
|
-
# # office.image = URI.parse(headers['location'])
|
329
|
-
# # office.save
|
330
|
-
# # end
|
331
|
-
# # rescue RETS::APIError => err
|
332
|
-
# # self.log "No image for #{office.lo_name}."
|
333
|
-
# # end
|
334
|
-
# #end
|
335
|
-
#
|
336
|
-
# #=============================================================================
|
337
|
-
# # GPS
|
338
|
-
# #=============================================================================
|
339
|
-
#
|
340
|
-
# def self.update_coords(p = nil)
|
341
|
-
# if p.nil?
|
342
|
-
# models = [CabooseRets::CommercialProperty, CabooseRets::LandProperty, CabooseRets::MultiFamilyProperty, CabooseRets::ResidentialProperty]
|
343
|
-
# names = ["commercial", "land", "multi-family", "residential"]
|
344
|
-
# i = 0
|
345
|
-
# models.each do |model|
|
346
|
-
# self.log "Updating coords #{names[i]} properties..."
|
347
|
-
# model.where(:latitude => nil).reorder(:mls).each do |p|
|
348
|
-
# self.update_coords(p)
|
349
|
-
# end
|
350
|
-
# i = i + 1
|
351
|
-
# end
|
352
|
-
# return
|
353
|
-
# end
|
354
|
-
#
|
355
|
-
# self.log "Getting coords for mls #{p.mls}..."
|
356
|
-
# coords = self.coords_from_address(CGI::escape "#{p.street_num} #{p.street_name}, #{p.city}, #{p.state} #{p.zip}")
|
357
|
-
# return if coords.nil? || coords == false
|
358
|
-
#
|
359
|
-
# p.latitude = coords['lat']
|
360
|
-
# p.longitude = coords['lng']
|
361
|
-
# p.save
|
362
|
-
# end
|
363
|
-
#
|
364
|
-
# def self.coords_from_address(address)
|
365
|
-
# return false
|
366
|
-
# begin
|
367
|
-
# uri = "https://maps.googleapis.com/maps/api/geocode/json?address=#{address}&sensor=false"
|
368
|
-
# uri.gsub!(" ", "+")
|
369
|
-
# resp = HTTParty.get(uri)
|
370
|
-
# json = JSON.parse(resp.body)
|
371
|
-
# return json['results'][0]['geometry']['location']
|
372
|
-
# rescue
|
373
|
-
# self.log "Error: #{uri}"
|
374
|
-
# sleep(2)
|
375
|
-
# return false
|
376
|
-
# end
|
377
|
-
# end
|
378
|
-
#
|
379
|
-
# #=============================================================================
|
380
|
-
# # Purging
|
381
|
-
# #=============================================================================
|
382
|
-
#
|
383
|
-
# def self.purge
|
384
|
-
# self.purge_residential
|
385
|
-
# self.purge_commercial
|
386
|
-
# self.purge_land
|
387
|
-
# self.purge_multi_family
|
388
|
-
# self.purge_offices
|
389
|
-
# self.purge_agents
|
390
|
-
# self.purge_open_houses
|
391
|
-
# self.purge_media
|
392
|
-
# end
|
393
|
-
#
|
394
|
-
# def self.purge_residential() self.purge_helper('RES', '2012-01-01') end
|
395
|
-
# def self.purge_commercial() self.purge_helper('COM', '2012-01-01') end
|
396
|
-
# def self.purge_land() self.purge_helper('LND', '2012-01-01') end
|
397
|
-
# def self.purge_multi_family() self.purge_helper('MUL', '2012-01-01') end
|
398
|
-
# def self.purge_offices() self.purge_helper('OFF', '2012-01-01') end
|
399
|
-
# def self.purge_agents() self.purge_helper('AGT', '2012-01-01') end
|
400
|
-
# def self.purge_open_houses() self.purge_helper('OPH', '2012-01-01') end
|
401
|
-
# def self.purge_media() self.purge_helper('GFX', '2012-01-01') end
|
402
|
-
#
|
403
|
-
# def self.purge_helper(class_type, date_modified)
|
404
|
-
# m = self.meta(class_type)
|
405
|
-
#
|
406
|
-
# puts "Purging #{class_type}..."
|
407
|
-
#
|
408
|
-
# # Get the total number of records
|
409
|
-
# puts "- Getting total number of records for #{class_type}..."
|
410
|
-
# params = {
|
411
|
-
# :search_type => m.search_type,
|
412
|
-
# :class => class_type,
|
413
|
-
# :query => "(#{m.date_modified_field}=#{date_modified}T00:00:01+)",
|
414
|
-
# :standard_names_only => true,
|
415
|
-
# :timeout => -1
|
416
|
-
# }
|
417
|
-
# self.client.search(params.merge({ :count_mode => :only }))
|
418
|
-
# count = self.client.rets_data[:code] == "20201" ? 0 : self.client.rets_data[:count]
|
419
|
-
# batch_count = (count.to_f/5000.0).ceil
|
420
|
-
#
|
421
|
-
# ids = []
|
422
|
-
# k = m.remote_key_field
|
423
|
-
# (0...batch_count).each do |i|
|
424
|
-
# puts "- Getting ids for #{class_type} (batch #{i+1} of #{batch_count})..."
|
425
|
-
# self.client.search(params.merge({ :select => [k], :limit => 5000, :offset => 5000*i })) do |data|
|
426
|
-
# ids << case class_type
|
427
|
-
# when 'RES' then data[k]
|
428
|
-
# when 'COM' then data[k]
|
429
|
-
# when 'LND' then data[k]
|
430
|
-
# when 'MUL' then data[k]
|
431
|
-
# when 'OFF' then data[k]
|
432
|
-
# when 'AGT' then data[k]
|
433
|
-
# when 'OPH' then data[k].to_i
|
434
|
-
# when 'GFX' then data[k]
|
435
|
-
# end
|
436
|
-
# end
|
437
|
-
# end
|
438
|
-
#
|
439
|
-
# # Delete any records in the local database that shouldn't be there
|
440
|
-
# puts "- Finding #{class_type} records in the local database that are not in the remote database..."
|
441
|
-
# t = m.local_table
|
442
|
-
# k = m.local_key_field
|
443
|
-
# query = "select distinct #{k} from #{t}"
|
444
|
-
# rows = ActiveRecord::Base.connection.select_all(ActiveRecord::Base.send(:sanitize_sql_array, query))
|
445
|
-
# local_ids = rows.collect{ |row| row[k] }
|
446
|
-
# ids_to_remove = local_ids - ids
|
447
|
-
# puts "- Found #{ids_to_remove.count} #{class_type} records in the local database that are not in the remote database."
|
448
|
-
# puts "- Deleting #{class_type} records in the local database that shouldn't be there..."
|
449
|
-
# query = ["delete from #{t} where #{k} not in (?)", ids_to_remove]
|
450
|
-
# ActiveRecord::Base.connection.execute(ActiveRecord::Base.send(:sanitize_sql_array, query))
|
451
|
-
#
|
452
|
-
# # Find any ids in the remote database that should be in the local database
|
453
|
-
# puts "- Finding #{class_type} records in the remote database that should be in the local database..."
|
454
|
-
# query = "select distinct #{k} from #{t}"
|
455
|
-
# rows = ActiveRecord::Base.connection.select_all(ActiveRecord::Base.send(:sanitize_sql_array, query))
|
456
|
-
# local_ids = rows.collect{ |row| row[k] }
|
457
|
-
# ids_to_add = ids - local_ids
|
458
|
-
# puts "- Found #{ids_to_add.count} #{class_type} records in the remote database that we need to add to the local database."
|
459
|
-
# ids_to_add.each do |id|
|
460
|
-
# puts "- Importing #{id}..."
|
461
|
-
# case class_type
|
462
|
-
# when 'RES' then self.delay.import_residential_property(id, false)
|
463
|
-
# when 'COM' then self.delay.import_commercial_property(id, false)
|
464
|
-
# when 'LND' then self.delay.import_land_property(id, false)
|
465
|
-
# when 'MUL' then self.delay.import_multi_family_property(id, false)
|
466
|
-
# when 'OFF' then self.delay.import_office(id, false)
|
467
|
-
# when 'AGT' then self.delay.import_agent(id, false)
|
468
|
-
# when 'OPH' then self.delay.import_open_house(id, false)
|
469
|
-
# when 'GFX' then self.delay.import_media(id, false)
|
470
|
-
# end
|
471
|
-
# end
|
472
|
-
#
|
473
|
-
# end
|
474
|
-
#
|
475
|
-
# def self.get_media_urls
|
476
|
-
# m = self.meta(class_type)
|
477
|
-
#
|
478
|
-
# # Get the total number of records
|
479
|
-
# params = {
|
480
|
-
# :search_type => m.search_type,
|
481
|
-
# :class => class_type,
|
482
|
-
# :query => "(#{m.date_modified_field}=#{date_modified}T00:00:01+)",
|
483
|
-
# :standard_names_only => true,
|
484
|
-
# :timeout => -1
|
485
|
-
# }
|
486
|
-
# self.client.search(params.merge({ :count_mode => :only }))
|
487
|
-
# count = self.client.rets_data[:code] == "20201" ? 0 : self.client.rets_data[:count]
|
488
|
-
# batch_count = (count.to_f/5000.0).ceil
|
489
|
-
#
|
490
|
-
# ids = []
|
491
|
-
# k = m.remote_key_field
|
492
|
-
# (0...batch_count).each do |i|
|
493
|
-
# self.client.search(params.merge({ :select => [k], :limit => 5000, :offset => 5000*i })) do |data|
|
494
|
-
# ids << case class_type
|
495
|
-
# when 'RES' then data[k]
|
496
|
-
# when 'COM' then data[k]
|
497
|
-
# when 'LND' then data[k]
|
498
|
-
# when 'MUL' then data[k]
|
499
|
-
# when 'OFF' then data[k]
|
500
|
-
# when 'AGT' then data[k]
|
501
|
-
# when 'OPH' then data[k].to_i
|
502
|
-
# when 'GFX' then data[k]
|
503
|
-
# end
|
504
|
-
# end
|
505
|
-
# end
|
506
|
-
#
|
507
|
-
# # Delete any records in the local database that shouldn't be there
|
508
|
-
# t = m.local_table
|
509
|
-
# k = m.local_key_field
|
510
|
-
# query = ["delete from #{t} where #{k} not in (?)", ids]
|
511
|
-
# ActiveRecord::Base.connection.execute(ActiveRecord::Base.send(:sanitize_sql_array, query))
|
512
|
-
#
|
513
|
-
# # Find any ids in the remote database that should be in the local database
|
514
|
-
# query = "select distinct #{k} from #{t}"
|
515
|
-
# rows = ActiveRecord::Base.connection.select_all(ActiveRecord::Base.send(:sanitize_sql_array, query))
|
516
|
-
# local_ids = rows.collect{ |row| row[k] }
|
517
|
-
# ids_to_add = ids - local_ids
|
518
|
-
# ids_to_add.each do |id|
|
519
|
-
# puts "Importing #{id}..."
|
520
|
-
# case class_type
|
521
|
-
# when 'RES' then self.delay.import_residential_property(id, false)
|
522
|
-
# when 'COM' then self.delay.import_commercial_property(id, false)
|
523
|
-
# when 'LND' then self.delay.import_land_property(id, false)
|
524
|
-
# when 'MUL' then self.delay.import_multi_family_property(id, false)
|
525
|
-
# when 'OFF' then self.delay.import_office(id, false)
|
526
|
-
# when 'AGT' then self.delay.import_agent(id, false)
|
527
|
-
# when 'OPH' then self.delay.import_open_house(id, false)
|
528
|
-
# when 'GFX' then self.delay.import_media(id)
|
529
|
-
# end
|
530
|
-
# end
|
531
|
-
#
|
532
|
-
# end
|
533
|
-
#
|
534
|
-
# #=============================================================================
|
535
|
-
# # Logging
|
536
|
-
# #=============================================================================
|
537
|
-
#
|
538
|
-
# def self.log(msg)
|
539
|
-
# puts "[rets_importer] #{msg}"
|
540
|
-
# #Rails.logger.info("[rets_importer] #{msg}")
|
541
|
-
# end
|
542
|
-
#
|
543
|
-
# #=============================================================================
|
544
|
-
# # Locking update task
|
545
|
-
# #=============================================================================
|
546
|
-
#
|
547
|
-
# def self.update_rets
|
548
|
-
# return if self.task_is_locked
|
549
|
-
# task_started = self.lock_task
|
550
|
-
#
|
551
|
-
# begin
|
552
|
-
# overlap = 30.seconds
|
553
|
-
# puts DateTime.now
|
554
|
-
# puts self.last_purged
|
555
|
-
# puts (DateTime.now - self.last_purged)
|
556
|
-
# if (DateTime.now - self.last_purged).to_i > 1
|
557
|
-
# self.purge
|
558
|
-
# self.save_last_purged(task_started)
|
559
|
-
# #overlap = 1.month
|
560
|
-
# end
|
561
|
-
# self.update_after(self.last_updated - overlap)
|
562
|
-
# self.save_last_updated(task_started)
|
563
|
-
# self.unlock_task
|
564
|
-
# rescue
|
565
|
-
# raise
|
566
|
-
# ensure
|
567
|
-
# self.unlock_task_if_last_updated(task_started)
|
568
|
-
# end
|
569
|
-
#
|
570
|
-
# # Start the same update process in five minutes
|
571
|
-
# self.delay(:run_at => 1.minutes.from_now).update_rets
|
572
|
-
# end
|
573
|
-
#
|
574
|
-
# def self.last_updated
|
575
|
-
# if !Caboose::Setting.exists?(:name => 'rets_last_updated')
|
576
|
-
# Caboose::Setting.create(:name => 'rets_last_updated', :value => '2013-08-06T00:00:01')
|
577
|
-
# end
|
578
|
-
# s = Caboose::Setting.where(:name => 'rets_last_updated').first
|
579
|
-
# return DateTime.parse(s.value)
|
580
|
-
# end
|
581
|
-
#
|
582
|
-
# def self.last_purged
|
583
|
-
# if !Caboose::Setting.exists?(:name => 'rets_last_purged')
|
584
|
-
# Caboose::Setting.create(:name => 'rets_last_purged', :value => '2013-08-06T00:00:01')
|
585
|
-
# end
|
586
|
-
# s = Caboose::Setting.where(:name => 'rets_last_purged').first
|
587
|
-
# return DateTime.parse(s.value)
|
588
|
-
# end
|
589
|
-
#
|
590
|
-
# def self.save_last_updated(d)
|
591
|
-
# s = Caboose::Setting.where(:name => 'rets_last_updated').first
|
592
|
-
# s.value = d.strftime('%FT%T')
|
593
|
-
# s.save
|
594
|
-
# end
|
595
|
-
#
|
596
|
-
# def self.save_last_purged(d)
|
597
|
-
# s = Caboose::Setting.where(:name => 'rets_last_purged').first
|
598
|
-
# s.value = d.strftime('%FT%T')
|
599
|
-
# s.save
|
600
|
-
# end
|
601
|
-
#
|
602
|
-
# def self.task_is_locked
|
603
|
-
# return Caboose::Setting.exists?(:name => 'rets_update_running')
|
604
|
-
# end
|
605
|
-
#
|
606
|
-
# def self.lock_task
|
607
|
-
# d = DateTime.now.utc - 5.hours
|
608
|
-
# Caboose::Setting.create(:name => 'rets_update_running', :value => d.strftime('%F %T'))
|
609
|
-
# return d
|
610
|
-
# end
|
611
|
-
#
|
612
|
-
# def self.unlock_task
|
613
|
-
# Caboose::Setting.where(:name => 'rets_update_running').first.destroy
|
614
|
-
# end
|
615
|
-
#
|
616
|
-
# def self.unlock_task_if_last_updated(d)
|
617
|
-
# setting = Caboose::Setting.where(:name => 'rets_update_running').first
|
618
|
-
# self.unlock_task if setting && d.strftime('%F %T') == setting.value
|
619
|
-
# end
|
620
|
-
#
|
621
|
-
#end
|