caboose-rets 0.1.168 → 0.1.173
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/caboose_rets/properties_controller.rb +48 -13
- data/app/models/caboose_rets/property.rb +1 -1
- data/app/models/caboose_rets/rets_importer.rb +3 -3
- data/app/models/caboose_rets/search_option.rb +44 -14
- data/app/views/caboose_rets/properties/facebook_listings_feed.rss.builder +2 -2
- data/app/views/caboose_rets/properties/facebook_products_feed.rss.builder +1 -1
- data/lib/caboose_rets/version.rb +1 -1
- data/lib/tasks/caboose_rets.rake +1 -2
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d696008a55d4db2c7e4355676577b1125127c58fbda6e18570f02db82b2d5c40
|
4
|
+
data.tar.gz: 8d87073dd33a633bc18ed370fdd5d7211fb7ad8918559062551955be50544a1c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7156982635d8c2588036a898809ac2101c975fcb69059b4047c2768186bdfc3d5beaeb2dd9294ed2a245460498bb3019a5531f71777bd2b97262e61f99646034
|
7
|
+
data.tar.gz: a3fafd917d276b72e04752df7c426ea939ad61408a52e26aafc81c0beca79467d8b63e238c06ec88eca5aa96090e1a790e99077f668eb11009f8a9f117f1878b
|
@@ -1,9 +1,7 @@
|
|
1
|
-
|
2
1
|
module CabooseRets
|
3
2
|
class PropertiesController < ApplicationController
|
4
3
|
|
5
4
|
# @route GET /properties/search-options
|
6
|
-
# q=rock quary
|
7
5
|
def search_options
|
8
6
|
count = params[:count_per_name] ? params[:count_per_name] : 10
|
9
7
|
arr = SearchOption.results(params[:q], count)
|
@@ -22,7 +20,34 @@ module CabooseRets
|
|
22
20
|
params[:street_name_like][0] = '' if params[:street_name_like][0].to_i == 0
|
23
21
|
end
|
24
22
|
end
|
25
|
-
where =
|
23
|
+
where = "(id is not null)"
|
24
|
+
search_options = []
|
25
|
+
searched_address = false
|
26
|
+
|
27
|
+
if (@site && @site.id == 558) || request.original_fullpath =~ /^\/tuscaloosa-condos-for-sale(.*?)$/
|
28
|
+
where = "(style ILIKE '%condo%' OR public_remarks ILIKE '%condo%' OR legal_description ILIKE '%unit%' OR res_style ILIKE '%condo%' OR property_subtype ILIKE '%condo%' OR property_subtype ILIKE '%townhouse%')"
|
29
|
+
end
|
30
|
+
|
31
|
+
if params[:location_query] && !params[:location_query].blank?
|
32
|
+
lc = params[:location_query]
|
33
|
+
if lc && lc.count > 0
|
34
|
+
lc.each do |lcid|
|
35
|
+
so = CabooseRets::SearchOption.where(:id => lcid).first
|
36
|
+
if so && so.name == "Street Address"
|
37
|
+
search_options << "( CONCAT(CONCAT(CONCAT(CONCAT(street_number, ' '),street_name),' '),street_suffix) ILIKE '%#{so.value}%' )"
|
38
|
+
searched_address = true
|
39
|
+
elsif so && so.name == "Street Name"
|
40
|
+
search_options << "( CONCAT(CONCAT(street_name,' '),street_suffix) ILIKE '%#{so.value}%' )"
|
41
|
+
elsif so
|
42
|
+
search_options << "(#{so.field} = '#{so.value}')"
|
43
|
+
searched_address = true if so.name == 'MLS Number'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
where2 = search_options.blank? ? "(id is not null)" : ("(" + search_options.join(' OR ') + ")")
|
50
|
+
|
26
51
|
sortby = @site && @site.id == 558 ? "original_entry_timestamp" : CabooseRets::default_property_sort
|
27
52
|
@saved_properties = CabooseRets::SavedProperty.where(:user_id => logged_in_user.id).pluck(:mls_number)
|
28
53
|
@pager = Caboose::PageBarGenerator.new(params, {
|
@@ -60,38 +85,48 @@ module CabooseRets
|
|
60
85
|
'foreclosure_yn' => '',
|
61
86
|
'address_like' => '',
|
62
87
|
'street_name_like' => '',
|
63
|
-
'street_number_like'
|
88
|
+
'street_number_like' => '',
|
64
89
|
'postal_code' => '',
|
65
|
-
'postal_code_like' => '',
|
90
|
+
'postal_code_like' => '',
|
66
91
|
'status' => 'Active'
|
67
92
|
},{
|
68
93
|
'model' => 'CabooseRets::Property',
|
69
94
|
'sort' => sortby,
|
70
95
|
'desc' => true,
|
71
96
|
'abbreviations' => {
|
72
|
-
|
97
|
+
'address_like' => 'street_number_concat_street_dir_prefix_concat_street_name_concat_street_suffix_concat_street_dir_suffix_like'
|
73
98
|
},
|
74
99
|
'skip' => ['status'],
|
100
|
+
'additional_params' => ['location_query'],
|
75
101
|
'base_url' => base_url,
|
76
102
|
'items_per_page' => 10,
|
77
|
-
'additional_where' => [ where ]
|
103
|
+
'additional_where' => [ where, where2 ]
|
78
104
|
})
|
79
105
|
|
106
|
+
@pager.original_params[:test] == "hey"
|
107
|
+
|
80
108
|
@properties = @pager.items
|
81
|
-
if params[:waterfronts].present? then @properties.reject
|
109
|
+
if params[:waterfronts].present? then @properties = @properties.reject{|p| p.waterfronts.blank?} end
|
82
110
|
# if params[:ftr_lotdesc] == 'golf' then @properties.reject!{|p| p.ftr_lotdesc != 'golf'} end
|
83
|
-
if params[:foreclosure_yn] then @properties.reject
|
111
|
+
if params[:foreclosure_yn] then @properties = @properties.reject{|p| p.foreclosure_yn != "Y"} end
|
84
112
|
|
85
|
-
@saved_search = nil
|
86
|
-
if CabooseRets::SavedSearch.exists?(:uri => request.fullpath)
|
87
|
-
|
88
|
-
end
|
113
|
+
# @saved_search = nil
|
114
|
+
# if CabooseRets::SavedSearch.exists?(:uri => request.fullpath)
|
115
|
+
# @saved_search = CabooseRets::SavedSearch.where(:uri => request.fullpath).first
|
116
|
+
# end
|
89
117
|
|
90
118
|
@block_options = {
|
91
119
|
:properties => @properties,
|
92
120
|
:saved_search => @saved_search,
|
93
121
|
:pager => @pager
|
94
122
|
}
|
123
|
+
|
124
|
+
if @properties && @properties.count == 1 && searched_address
|
125
|
+
only_property = @properties.first
|
126
|
+
redirect_to only_property.url and return
|
127
|
+
end
|
128
|
+
|
129
|
+
|
95
130
|
end
|
96
131
|
|
97
132
|
# @route GET /properties/:mls_number/details
|
@@ -161,7 +161,7 @@ class CabooseRets::Property <ActiveRecord::Base
|
|
161
161
|
self.matrix_unique_id = data['ListingKey']
|
162
162
|
self.matrix_modified_dt = data['ModificationTimestamp']
|
163
163
|
self.max_sqft = data['LivingArea']
|
164
|
-
self.middle_school = data['
|
164
|
+
self.middle_school = data['MiddleOrJuniorSchool']
|
165
165
|
# self.mineral_rights = data['MineralRights']
|
166
166
|
self.min_sqft = data['LivingArea']
|
167
167
|
self.misc_indoor_featuresa = data['BuildingFeatures']
|
@@ -696,7 +696,6 @@ class CabooseRets::RetsImporter # < ActiveRecord::Base
|
|
696
696
|
end
|
697
697
|
self.log2("Locking task...")
|
698
698
|
task_started = self.lock_task
|
699
|
-
|
700
699
|
begin
|
701
700
|
overlap = 2.hours
|
702
701
|
if (DateTime.now - self.last_purged).to_f >= 0.5
|
@@ -717,7 +716,6 @@ class CabooseRets::RetsImporter # < ActiveRecord::Base
|
|
717
716
|
self.log2("Unlocking task if last updated...")
|
718
717
|
self.unlock_task_if_last_updated(task_started)
|
719
718
|
end
|
720
|
-
|
721
719
|
# Start the same update process in 20 minutes
|
722
720
|
self.log3(nil,nil,"Adding the update rets task for 20 minutes from now...")
|
723
721
|
q = "handler like '%update_rets%'"
|
@@ -726,7 +724,9 @@ class CabooseRets::RetsImporter # < ActiveRecord::Base
|
|
726
724
|
self.delay(:run_at => 20.minutes.from_now, :priority => 10, :queue => 'rets').update_rets
|
727
725
|
end
|
728
726
|
# Delete old logs
|
729
|
-
CabooseRets::Log.where("timestamp < ?",(DateTime.now -
|
727
|
+
CabooseRets::Log.where("timestamp < ?",(DateTime.now - 7.days)).destroy_all
|
728
|
+
# Update search options
|
729
|
+
CabooseRets::SearchOption.delay(:queue => "rets").update_search_options
|
730
730
|
end
|
731
731
|
|
732
732
|
def self.last_updated
|
@@ -16,10 +16,9 @@ class CabooseRets::SearchOption < ActiveRecord::Base
|
|
16
16
|
'MLS Area' => ['area'],
|
17
17
|
'Neighborhood' => ['subdivision'],
|
18
18
|
'Street Name' => ['street_name'],
|
19
|
+
'Street Address' => ['street_address'],
|
19
20
|
'Property Type' => ['property_type'],
|
20
|
-
'MLS Number' => ['mls_number']
|
21
|
-
#'feature',
|
22
|
-
#'location',
|
21
|
+
'MLS Number' => ['mls_number']
|
23
22
|
}
|
24
23
|
names.each do |name, fields|
|
25
24
|
fields.each do |field|
|
@@ -27,32 +26,63 @@ class CabooseRets::SearchOption < ActiveRecord::Base
|
|
27
26
|
end
|
28
27
|
end
|
29
28
|
|
29
|
+
|
30
30
|
# Delete all flagged
|
31
31
|
self.where(:flag_for_delete => true).delete_all
|
32
32
|
end
|
33
33
|
|
34
34
|
def self.update_search_options_for_field(name, field)
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
self.
|
41
|
-
|
42
|
-
|
43
|
-
so
|
35
|
+
if field == 'street_name'
|
36
|
+
CabooseRets::Property.where(:status => "Active", :property_type => "Residential").where("street_name is not null").order(:id).all.each do |prop|
|
37
|
+
add = "#{prop.street_name} #{prop.street_suffix}"
|
38
|
+
val = add.blank? ? nil : add.strip
|
39
|
+
next if val.blank?
|
40
|
+
so = self.where(:name => name, :field => field, :value => val).first
|
41
|
+
if so.nil? && !field.blank?
|
42
|
+
self.create(:name => name, :field => field, :value => val)
|
43
|
+
elsif so
|
44
|
+
so.flag_for_delete = false
|
45
|
+
so.save
|
46
|
+
end
|
47
|
+
end
|
48
|
+
elsif field == 'street_address'
|
49
|
+
CabooseRets::Property.where(:status => "Active", :property_type => "Residential").where("street_name is not null and street_number is not null").order(:id).all.each do |prop|
|
50
|
+
add = "#{prop.street_number} #{prop.street_name} #{prop.street_suffix}"
|
51
|
+
val = add.blank? ? nil : add.strip
|
52
|
+
next if val.blank?
|
53
|
+
so = self.where(:name => name, :field => field, :value => val).first
|
54
|
+
if so.nil? && !field.blank?
|
55
|
+
self.create(:name => name, :field => field, :value => val)
|
56
|
+
elsif so
|
57
|
+
so.flag_for_delete = false
|
58
|
+
so.save
|
59
|
+
end
|
60
|
+
end
|
61
|
+
else
|
62
|
+
q = ["select distinct(#{field}) from rets_properties where status = ? and property_type = ?", 'Active', 'Residential']
|
63
|
+
rows = ActiveRecord::Base.connection.select_rows(ActiveRecord::Base.send(:sanitize_sql_array, q))
|
64
|
+
rows.each do |row|
|
65
|
+
val = row[0].blank? ? nil : row[0].titleize.strip
|
66
|
+
next if val.blank?
|
67
|
+
so = self.where(:name => name, :field => field, :value => val).first
|
68
|
+
if so.nil? && !field.blank?
|
69
|
+
self.create(:name => name, :field => field, :value => val)
|
70
|
+
elsif so
|
71
|
+
so.flag_for_delete = false
|
72
|
+
so.save
|
73
|
+
end
|
44
74
|
end
|
45
75
|
end
|
46
76
|
end
|
47
77
|
|
48
78
|
def self.results(str, count_per_name = 10)
|
49
79
|
q = ["select * from (
|
50
|
-
select name, field, value, row_number() over (partition by name order by field) as rownum
|
80
|
+
select id, name, field, value, row_number() over (partition by name order by field) as rownum
|
51
81
|
from rets_search_options
|
52
82
|
where lower(value) like ?
|
53
83
|
) tmp where rownum < #{count_per_name}", "%#{str}%"]
|
54
84
|
rows = ActiveRecord::Base.connection.select_rows(ActiveRecord::Base.send(:sanitize_sql_array, q))
|
55
|
-
arr = rows.collect{ |row| { :
|
85
|
+
arr = rows.collect{ |row| { :id => row[0].to_i, :name => row[1], :field => row[2], :text => row[3] }}
|
56
86
|
return arr
|
57
87
|
end
|
58
88
|
|
@@ -1,5 +1,4 @@
|
|
1
1
|
domain = Caboose::Domain.where(:site_id => @site.id, :primary => true).first.domain
|
2
|
-
hp = Caboose::Page.where(:site_id => @site.id, :title => "Home").first
|
3
2
|
xml.instruct! :xml, :version => "1.0"
|
4
3
|
xml.listings do
|
5
4
|
xml.title @site.id == 558 ? "The Gray Group" : @site.description
|
@@ -39,7 +38,8 @@ xml.instruct! :xml, :version => "1.0"
|
|
39
38
|
elsif !property.alternate_link.blank? && @use_alternate_link == true
|
40
39
|
xml.url(property.alternate_link)
|
41
40
|
else
|
42
|
-
|
41
|
+
url = "https://" + domain + "/properties/#{property.mls_number}/details?utm_source=Nine&utm_medium=Facebook&utm_campaign=Retargeting"
|
42
|
+
xml.url( url )
|
43
43
|
end
|
44
44
|
xml.year_built(property.year_built)
|
45
45
|
if !property.property_type.blank?
|
@@ -12,7 +12,7 @@ xml.rss :version => "2.0", "xmlns:g" => "http://base.google.com/ns/1.0" do
|
|
12
12
|
xml.g(:id, property.mls_number)
|
13
13
|
xml.g(:title, property.full_address)
|
14
14
|
xml.g(:description, property.public_remarks)
|
15
|
-
xml.g(:link, "https://" + domain + "/properties/#{property.mls_number}/details
|
15
|
+
xml.g(:link, "https://" + domain + "/properties/#{property.mls_number}/details")
|
16
16
|
first_image = property.images.first if property.images
|
17
17
|
m = Caboose::Media.where(:id => first_image.media_id).first if first_image && !first_image.media_id.blank?
|
18
18
|
if m && m.image
|
data/lib/caboose_rets/version.rb
CHANGED
data/lib/tasks/caboose_rets.rake
CHANGED
@@ -283,9 +283,7 @@ namespace :caboose_rets do
|
|
283
283
|
end
|
284
284
|
CabooseRets::RetsImporter.log("Updating rets data...")
|
285
285
|
task_started = lock_task
|
286
|
-
|
287
286
|
begin
|
288
|
-
# RetsImporter.update_all_after(last_updated - Rational(1,86400))
|
289
287
|
CabooseRets::RetsImporter.update_after(last_updated, true)
|
290
288
|
save_last_updated(task_started)
|
291
289
|
unlock_task
|
@@ -294,6 +292,7 @@ namespace :caboose_rets do
|
|
294
292
|
ensure
|
295
293
|
unlock_task_if_last_updated(task_started)
|
296
294
|
end
|
295
|
+
CabooseRets::SearchOption.delay(:queue => "rets").update_search_options
|
297
296
|
end
|
298
297
|
|
299
298
|
def last_updated
|
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.173
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- William Barry
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-02-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: caboose-cms
|
@@ -162,7 +162,7 @@ homepage: http://github.com/williambarry007/caboose-rets
|
|
162
162
|
licenses:
|
163
163
|
- MIT
|
164
164
|
metadata: {}
|
165
|
-
post_install_message:
|
165
|
+
post_install_message:
|
166
166
|
rdoc_options: []
|
167
167
|
require_paths:
|
168
168
|
- lib
|
@@ -177,9 +177,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
177
177
|
- !ruby/object:Gem::Version
|
178
178
|
version: '0'
|
179
179
|
requirements: []
|
180
|
-
rubyforge_project:
|
180
|
+
rubyforge_project:
|
181
181
|
rubygems_version: 2.7.8
|
182
|
-
signing_key:
|
182
|
+
signing_key:
|
183
183
|
specification_version: 4
|
184
184
|
summary: Library to download RETS data to a local website.
|
185
185
|
test_files:
|