caboose-rets 0.0.15 → 0.0.16
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 +8 -8
- data/app/controllers/caboose_rets/residential_controller.rb +5 -0
- data/app/controllers/caboose_rets/saved_searches_controller.rb +82 -0
- data/app/models/caboose_rets/rets_plugin.rb +10 -1
- data/app/models/caboose_rets/saved_search.rb +86 -0
- data/app/views/caboose_rets/saved_searches/edit.html.erb +35 -0
- data/app/views/caboose_rets/saved_searches/index.html.erb +78 -0
- data/config/routes.rb +6 -0
- data/lib/caboose_rets/version.rb +1 -1
- metadata +5 -1
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NmQ4NTg0MjYwZGM4NzhhNjU5NDJmZTZlNThkOTRjNTE5NjUzYTE4NA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
Y2Y3ZDViNmM5N2Q0MTRjZTA0NDkyMzliNGY4OWQxZjhhYWJhOTBlZQ==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZWQ5OTIwMGJmOWY5M2M4NGViZmVkZTQ4ODhiNWE5Y2U3ZjNiYWQwN2Q4N2Ew
|
10
|
+
YTBkNjhjMDkyNjA3YjYyZWNkZTJiM2E0NTRjZTZlNWIwZDkxZjM1ZWMwZDE1
|
11
|
+
NjI3MTBlOThlOTY5YTAzNjk2N2EwZDE0MjUwMTU0MjI4YzkzZWM=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MTgwOTEwZDEzYWI1OTNjMmNlNjkxZjNiMTdkYzIzNDE3YzJlNDhjODQ0NGMw
|
14
|
+
N2RhODJjM2Q0NDIyZjhmMTM5OTgwMTgwNWZlN2ZiNmRkODNhZjUwZTQxNzY5
|
15
|
+
NWEzNWQ1OWVhOTlkMzczMzRkNDA0ZWU3M2UzZmY0NGM4NWIzYjQ=
|
@@ -53,6 +53,11 @@ module CabooseRets
|
|
53
53
|
if params[:waterfront].present? then @properties.reject!{|p| p.waterfront.blank?} end
|
54
54
|
if params[:ftr_lotdesc] == 'golf' then @properties.reject!{|p| p.ftr_lotdesc != 'golf'} end
|
55
55
|
#if params[:foreclosure] then @properties.reject!{|p| p.foreclosure_yn != "Y"} end
|
56
|
+
|
57
|
+
@saved_search = nil
|
58
|
+
if CabooseRets::SavedSearch.exists?(:uri => request.fullpath)
|
59
|
+
@saved_search = CabooseRets::SavedSearch.where(:uri => request.fullpath).first
|
60
|
+
end
|
56
61
|
end
|
57
62
|
|
58
63
|
# GET /residential/:mls_acct/details
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module CabooseRets
|
2
|
+
class SavedSearchesController < ApplicationController
|
3
|
+
|
4
|
+
# GET /saved-searches
|
5
|
+
def index
|
6
|
+
return if !verify_logged_in
|
7
|
+
@searches = SavedSearch.where(:user_id => logged_in_user.id).all
|
8
|
+
render :layout => 'caboose/modal'
|
9
|
+
end
|
10
|
+
|
11
|
+
# POST /saved-searches
|
12
|
+
def add
|
13
|
+
return if !verify_logged_in
|
14
|
+
|
15
|
+
resp = Caboose::StdClass.new
|
16
|
+
|
17
|
+
if SavedSearch.exists?(:uri => params[:uri])
|
18
|
+
resp.redirect = "/saved-searches"
|
19
|
+
else
|
20
|
+
search = SavedSearch.new(
|
21
|
+
:user_id => logged_in_user.id,
|
22
|
+
:date_last => Date.today,
|
23
|
+
:interval => 1,
|
24
|
+
:notify => true,
|
25
|
+
:uri => params[:uri],
|
26
|
+
:property_type => params[:property_type],
|
27
|
+
:params => params[:params]
|
28
|
+
)
|
29
|
+
if search.save
|
30
|
+
resp.redirect = "/saved-searches"
|
31
|
+
else
|
32
|
+
resp.error = "There was an error saving your search."
|
33
|
+
end
|
34
|
+
end
|
35
|
+
render :json => resp
|
36
|
+
end
|
37
|
+
|
38
|
+
# GET /saved-searches/:id
|
39
|
+
def redirect
|
40
|
+
return if !verify_logged_in
|
41
|
+
@search = SavedSearch.find(params[:id])
|
42
|
+
redirect_to @search.uri
|
43
|
+
end
|
44
|
+
|
45
|
+
# PUT /saved-searches/:id
|
46
|
+
def update
|
47
|
+
return if !verify_logged_in
|
48
|
+
|
49
|
+
resp = Caboose::StdClass.new({'attributes' => {}})
|
50
|
+
search = SavedSearch.find(params[:id])
|
51
|
+
|
52
|
+
save = true
|
53
|
+
params.each do |name,value|
|
54
|
+
case name
|
55
|
+
when 'interval'
|
56
|
+
search.interval = value
|
57
|
+
resp.attributes['interval'] = { 'text' => "#{value}" }
|
58
|
+
end
|
59
|
+
end
|
60
|
+
resp.success = save && search.save
|
61
|
+
render :json => resp
|
62
|
+
end
|
63
|
+
|
64
|
+
# DELETE /saved-searches/:id
|
65
|
+
def delete
|
66
|
+
return if !verify_logged_in
|
67
|
+
|
68
|
+
resp = Caboose::StdClass.new
|
69
|
+
search = SavedSearch.find(params[:id])
|
70
|
+
|
71
|
+
if search
|
72
|
+
search.destroy
|
73
|
+
resp.success = "The saved search has been deleted."
|
74
|
+
else
|
75
|
+
resp.error = "There was an error deleting your search."
|
76
|
+
end
|
77
|
+
|
78
|
+
render :json => resp
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
@@ -1,7 +1,16 @@
|
|
1
1
|
class CabooseRets::RetsPlugin < Caboose::CaboosePlugin
|
2
2
|
|
3
3
|
def self.admin_nav(nav, user = nil, page = nil)
|
4
|
-
return nav if user.nil?
|
4
|
+
return nav if user.nil?
|
5
|
+
|
6
|
+
nav << {
|
7
|
+
'id' => 'saved-searches',
|
8
|
+
'text' => 'Saved Searches',
|
9
|
+
'href' => '/saved-searches',
|
10
|
+
'modal' => true
|
11
|
+
}
|
12
|
+
|
13
|
+
return nav if !user.is_allowed('properties', 'view')
|
5
14
|
|
6
15
|
item = {
|
7
16
|
'id' => 'rets',
|
@@ -0,0 +1,86 @@
|
|
1
|
+
class CabooseRets::SavedSearch < ActiveRecord::Base
|
2
|
+
self.table_name = 'rets_saved_searches'
|
3
|
+
|
4
|
+
belongs_to :user
|
5
|
+
attr_accessible :id, :user_id, :property_type, :uri, :params, :date_last, :interval, :notify
|
6
|
+
|
7
|
+
# We're storing the params as JSON, so parse it when we init
|
8
|
+
after_initialize do
|
9
|
+
unless self.params.is_a?(Hash) || self.params.nil?
|
10
|
+
obj = JSON.parse(self.params)
|
11
|
+
self.params = obj
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# Store it back as JSON
|
16
|
+
before_save do
|
17
|
+
obj = Caboose::StdClass.new(self.params)
|
18
|
+
self.params = obj.to_json
|
19
|
+
end
|
20
|
+
|
21
|
+
def results()
|
22
|
+
@gen = Caboose::PageBarGenerator.new(self.params, self.search_fields, self.search_options)
|
23
|
+
return @gen.items
|
24
|
+
end
|
25
|
+
|
26
|
+
def new_results?()
|
27
|
+
return false if self.new_results.nil? || self.new_results == []
|
28
|
+
end
|
29
|
+
|
30
|
+
def new_results
|
31
|
+
return self.results.reject{|r|r.date_created.to_date > self.date_last.to_date }
|
32
|
+
end
|
33
|
+
|
34
|
+
def model
|
35
|
+
case self.property_type
|
36
|
+
when 'residential' then return CabooseRets::ResidentialProperty
|
37
|
+
when 'commercial' then return CabooseRets::CommercialProperty
|
38
|
+
when 'land' then return CabooseRets::LandProperty
|
39
|
+
when 'multi-family' then return CabooseRets::MultiFamilyProperty
|
40
|
+
end
|
41
|
+
return nil
|
42
|
+
end
|
43
|
+
|
44
|
+
def search_fields()
|
45
|
+
return {
|
46
|
+
'name' => '',
|
47
|
+
'current_price_gte' => '',
|
48
|
+
'current_price_lte' => '',
|
49
|
+
'bedrooms_gte' => '',
|
50
|
+
'bedrooms_lte' => '',
|
51
|
+
'prop_type' => '',
|
52
|
+
'tot_heat_sqft_gte' => '',
|
53
|
+
'tot_heat_sqft_lte' => '',
|
54
|
+
'neighborhood' => '',
|
55
|
+
'elem_school' => '',
|
56
|
+
'middle_school' => '',
|
57
|
+
'high_school' => '',
|
58
|
+
'address' => '',
|
59
|
+
'lo_lo_code' => '',
|
60
|
+
'remarks_like' => '',
|
61
|
+
'waterfront' => '',
|
62
|
+
'ftr_lotdesc_like' => '',
|
63
|
+
'mls_acct' => '',
|
64
|
+
'subdivision' => '',
|
65
|
+
'foreclosure_yn' => '',
|
66
|
+
'street_name_like' => '',
|
67
|
+
'street_num_like' => '',
|
68
|
+
'date_created_gte' => '',
|
69
|
+
'date_created_lte' => '',
|
70
|
+
'date_modified_gte' => '',
|
71
|
+
'date_modified_lte' => '',
|
72
|
+
'status' => ['active']
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
76
|
+
def search_options
|
77
|
+
return {
|
78
|
+
'model' => self.model.to_s,
|
79
|
+
'sort' => 'current_price ASC, mls_acct',
|
80
|
+
'desc' => false,
|
81
|
+
'base_url' => "/#{self.property_type}",
|
82
|
+
'items_per_page' => 10
|
83
|
+
}
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
|
2
|
+
<h1>Edit Saved Search</h1>
|
3
|
+
<%= render :partial => 'caboose_rets/agents/admin_top_nav' %>
|
4
|
+
|
5
|
+
<p>Search Type: <%= @search.property_type %></p>
|
6
|
+
<p>Parameters: </p>
|
7
|
+
<ul><% @search.params.each do |k,v| %><li><%= k %>: <%= v %></li><% end %></ul>
|
8
|
+
<div id='savedsearch_<%= @search.id %>_notify'></div>
|
9
|
+
|
10
|
+
<p style='clear: both;'><input type='button' value='< Back' onclick="window.location='/saved-searches';" /></p>
|
11
|
+
|
12
|
+
<% content_for :caboose_js do %>
|
13
|
+
<%= javascript_include_tag "caboose/model/all" %>
|
14
|
+
<script type='text/javascript'>
|
15
|
+
$(document).ready(function() {
|
16
|
+
m = new ModelBinder({
|
17
|
+
name: 'SavedSearch',
|
18
|
+
id: <%= @search.id %>,
|
19
|
+
update_url: '/saved-searches/<%= @search.id %>',
|
20
|
+
authenticity_token: '<%= form_authenticity_token %>',
|
21
|
+
attributes: [{
|
22
|
+
name: 'notify',
|
23
|
+
nice_name: 'Notify me of new properties',
|
24
|
+
type: 'checkbox',
|
25
|
+
value: <%= @search.notify ? 1 : 0 %>,
|
26
|
+
width: 600
|
27
|
+
}]
|
28
|
+
});
|
29
|
+
});
|
30
|
+
$(window).load(function() {
|
31
|
+
var modal = new CabooseModal(800);
|
32
|
+
});
|
33
|
+
|
34
|
+
</script>
|
35
|
+
<% end %>
|
@@ -0,0 +1,78 @@
|
|
1
|
+
<h1>Saved Searches</h1>
|
2
|
+
|
3
|
+
<% if @searches && @searches.count > 0 %>
|
4
|
+
<table class='data'>
|
5
|
+
<tr>
|
6
|
+
<th>Parameters</th>
|
7
|
+
<th>Notify</th>
|
8
|
+
<th> </th>
|
9
|
+
<th> </th>
|
10
|
+
</tr>
|
11
|
+
<% @searches.each do |search| %>
|
12
|
+
<tr>
|
13
|
+
<td>
|
14
|
+
<% search.params.each do |k,v| %>
|
15
|
+
<% next if v.nil? || v.length == 0 %>
|
16
|
+
<%= k.titleize %>: <%= v %><br />
|
17
|
+
<% end %>
|
18
|
+
</td>
|
19
|
+
<td><div id='savedsearch_<%= search.id %>_notify'></div></td>
|
20
|
+
<td><input type='button' value='See Results' onclick="parent.window.location='<%= raw search.uri %>';" /></td>
|
21
|
+
<td><input type='button' value='Delete Search' onclick="delete_search(<%= search.id %>);" /></td>
|
22
|
+
</tr>
|
23
|
+
<% end %>
|
24
|
+
</table>
|
25
|
+
<% else %>
|
26
|
+
<p>You don't have any saved searches yet.</p>
|
27
|
+
<% end %>
|
28
|
+
|
29
|
+
<div id='message'></div>
|
30
|
+
<p><input type='button' value='Close' onclick="modal.close();" /></p>
|
31
|
+
|
32
|
+
<% content_for :caboose_js do %>
|
33
|
+
<%= javascript_include_tag "caboose/model/all" %>
|
34
|
+
<script type='text/javascript'>
|
35
|
+
|
36
|
+
$(document).ready(function() {
|
37
|
+
<% @searches.each do |search| %>
|
38
|
+
m = new ModelBinder({
|
39
|
+
name: 'SavedSearch',
|
40
|
+
id: <%= search.id %>,
|
41
|
+
update_url: '/saved-searches/<%= search.id %>',
|
42
|
+
authenticity_token: '<%= form_authenticity_token %>',
|
43
|
+
attributes: [{ name: 'notify', nice_name: 'Notify', type: 'checkbox', fixed_placeholder: false, value: <%= search.notify ? 1 : 0 %>, width: 25 }]
|
44
|
+
});
|
45
|
+
<% end %>
|
46
|
+
});
|
47
|
+
|
48
|
+
function delete_search(search_id, confirm)
|
49
|
+
{
|
50
|
+
if (!confirm)
|
51
|
+
{
|
52
|
+
var p = $('<p/>')
|
53
|
+
.addClass('note warning')
|
54
|
+
.append("Are you sure? This can't be undone. ")
|
55
|
+
.append($("<input />").attr('type', 'button').val('Yes').click(function() { delete_search(search_id, true); }))
|
56
|
+
.append(" ")
|
57
|
+
.append($("<input />").attr('type', 'button').val('No' ).click(function() { $('#message').empty(); modal.autosize(); }))
|
58
|
+
modal.autosize(p);
|
59
|
+
return;
|
60
|
+
}
|
61
|
+
modal.autosize("<p class='loading'>Deleting search...</p>");
|
62
|
+
$.ajax({
|
63
|
+
url: '/saved-searches/' + search_id,
|
64
|
+
type: 'delete',
|
65
|
+
success: function(resp) {
|
66
|
+
if (resp.success) window.location.reload(true);
|
67
|
+
if (resp.error) modal.autosize("<p class='note error'>" + resp.error + "</p>");
|
68
|
+
}
|
69
|
+
});
|
70
|
+
}
|
71
|
+
|
72
|
+
var modal = false;
|
73
|
+
$(window).load(function() {
|
74
|
+
modal = new CabooseModal(800);
|
75
|
+
});
|
76
|
+
|
77
|
+
</script>
|
78
|
+
<% end %>
|
data/config/routes.rb
CHANGED
@@ -60,5 +60,11 @@ CabooseRets::Engine.routes.draw do
|
|
60
60
|
get "admin/multi-family/:mls_acct/refresh" => "multi_family#admin_refresh"
|
61
61
|
put "admin/multi-family/:mls_acct" => "multi_family#admin_update"
|
62
62
|
post "admin/multi-family/:mls_acct" => "multi_family#admin_update"
|
63
|
+
|
64
|
+
get "saved-searches" => "saved_searches#index"
|
65
|
+
post "saved-searches" => "saved_searches#add"
|
66
|
+
get "saved-searches/:id" => "saved_searches#redirect"
|
67
|
+
put "saved-searches/:id" => "saved_searches#update"
|
68
|
+
delete "saved-searches/:id" => "saved_searches#delete"
|
63
69
|
|
64
70
|
end
|
data/lib/caboose_rets/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: caboose-rets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- William Barry
|
@@ -39,6 +39,7 @@ files:
|
|
39
39
|
- app/controllers/caboose_rets/offices_controller.rb
|
40
40
|
- app/controllers/caboose_rets/open_houses_controller.rb
|
41
41
|
- app/controllers/caboose_rets/residential_controller.rb
|
42
|
+
- app/controllers/caboose_rets/saved_searches_controller.rb
|
42
43
|
- app/helpers/caboose_rets/application_helper.rb
|
43
44
|
- app/models/caboose_rets/agent.rb
|
44
45
|
- app/models/caboose_rets/commercial_property.rb
|
@@ -50,6 +51,7 @@ files:
|
|
50
51
|
- app/models/caboose_rets/residential_property.rb
|
51
52
|
- app/models/caboose_rets/rets_importer.rb
|
52
53
|
- app/models/caboose_rets/rets_plugin.rb
|
54
|
+
- app/models/caboose_rets/saved_search.rb
|
53
55
|
- app/views/caboose_rets/agents/_admin_top_nav.html.erb
|
54
56
|
- app/views/caboose_rets/agents/admin_edit.html.erb
|
55
57
|
- app/views/caboose_rets/agents/admin_edit_bio.html.erb
|
@@ -78,6 +80,8 @@ files:
|
|
78
80
|
- app/views/caboose_rets/residential/index.html.erb
|
79
81
|
- app/views/caboose_rets/residential/residential_not_exists.html.erb
|
80
82
|
- app/views/caboose_rets/residential/test_form.html.erb
|
83
|
+
- app/views/caboose_rets/saved_searches/edit.html.erb
|
84
|
+
- app/views/caboose_rets/saved_searches/index.html.erb
|
81
85
|
- config/routes.rb
|
82
86
|
- lib/caboose-rets.rb
|
83
87
|
- lib/caboose_rets/caboose_rets_helper.rb
|