Class: SparkApi::Models::Listing
- Inherits:
-
Base
- Object
- Base
- SparkApi::Models::Listing
show all
- Extended by:
- Finders
- Defined in:
- lib/spark_api/models/listing.rb
Constant Summary
collapse
- DATA_MASK =
"********"
- WRITEABLE_FIELDS =
["ListPrice", "ExpirationDate"]
Constants included
from Paginate
Paginate::DEFAULT_PAGE_SIZE
Instance Attribute Summary collapse
Attributes inherited from Base
#attributes, #errors, #parent
Class Method Summary
collapse
Instance Method Summary
collapse
Methods included from Finders
find, find_one, first, last
Methods inherited from Base
#connection, connection, count, element_name, element_name=, first, get, #id, #load, #parse_id, path, #path, #persisted?, prefix, prefix=, #resource_pluralized, #resource_uri, #to_param, #to_partial_path
Methods included from Paginate
#collect, #paginate, #per_page
Methods included from Dirty
#changed, #changed?, #changed_attributes, #changes, #dirty_attributes, #previous_changes
Constructor Details
#initialize(attributes = {}) ⇒ Listing
Returns a new instance of Listing.
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
# File 'lib/spark_api/models/listing.rb', line 11
def initialize(attributes={})
@photos = []
@videos = []
@virtual_tours = []
@rental_calendars = []
@documents = []
@constraints = []
@tour_of_homes = []
@open_houses = []
@floplans = []
if attributes.has_key?('StandardFields')
pics, vids, tours, docs, ohouses, tourhomes = attributes['StandardFields'].values_at('Photos','Videos', 'VirtualTours', 'Documents', 'OpenHouses', 'TourOfHomes')
end
if attributes.has_key?('RentalCalendar')
rentalcalendars = attributes['RentalCalendar']
end
if attributes.has_key?('FloPlans')
floplans = attributes['FloPlans']
end
if pics != nil
setup_attribute(@photos, pics, Photo)
attributes['StandardFields'].delete('Photos')
end
if vids != nil
setup_attribute(@videos, vids, Video)
attributes['StandardFields'].delete('Videos')
end
if tours != nil
setup_attribute(@virtual_tours, tours, VirtualTour)
attributes['StandardFields'].delete('VirtualTours')
end
if docs != nil
setup_attribute(@documents, docs, Document)
attributes['StandardFields'].delete('Documents')
end
if ohouses != nil
setup_attribute(@open_houses, ohouses, OpenHouse)
attributes['StandardFields'].delete('OpenHouses')
end
if tourhomes != nil
setup_attribute(@tour_of_homes, tourhomes, TourOfHome)
attributes['StandardFields'].delete('TourOfHomes')
end
if rentalcalendars != nil
setup_attribute(@rental_calendars, rentalcalendars, RentalCalendar)
attributes.delete('RentalCalendar')
end
if floplans != nil
setup_attribute(@floplans, floplans, FloPlan)
attributes.delete('FloPlans')
end
super(attributes)
end
|
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method_symbol, *arguments) ⇒ Object
TODO trim this down so we’re only overriding the StandardFields access
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
|
# File 'lib/spark_api/models/listing.rb', line 270
def method_missing(method_symbol, *arguments)
method_name = method_symbol.to_s
if method_name =~ /(=|\?)$/
case $1
when "="
write_attribute($`,arguments.first)
when "?"
attributes[$`]
end
else
return attributes[method_name] if attributes.include?(method_name)
return @attributes['StandardFields'][method_name] if attributes['StandardFields'].include?(method_name)
super
end
end
|
Instance Attribute Details
#constraints ⇒ Object
Returns the value of attribute constraints.
6
7
8
|
# File 'lib/spark_api/models/listing.rb', line 6
def constraints
@constraints
end
|
#documents ⇒ Object
Returns the value of attribute documents.
5
6
7
|
# File 'lib/spark_api/models/listing.rb', line 5
def documents
@documents
end
|
#floplans ⇒ Object
Returns the value of attribute floplans.
5
6
7
|
# File 'lib/spark_api/models/listing.rb', line 5
def floplans
@floplans
end
|
#open_houses(arguments = {}) ⇒ Object
Returns the value of attribute open_houses.
5
6
7
|
# File 'lib/spark_api/models/listing.rb', line 5
def open_houses
@open_houses
end
|
#photos ⇒ Object
Returns the value of attribute photos.
5
6
7
|
# File 'lib/spark_api/models/listing.rb', line 5
def photos
@photos
end
|
#rental_calendars(arguments = {}) ⇒ Object
Returns the value of attribute rental_calendars.
5
6
7
|
# File 'lib/spark_api/models/listing.rb', line 5
def rental_calendars
@rental_calendars
end
|
#tour_of_homes(arguments = {}) ⇒ Object
Returns the value of attribute tour_of_homes.
5
6
7
|
# File 'lib/spark_api/models/listing.rb', line 5
def tour_of_homes
@tour_of_homes
end
|
#videos ⇒ Object
Returns the value of attribute videos.
5
6
7
|
# File 'lib/spark_api/models/listing.rb', line 5
def videos
@videos
end
|
#virtual_tours ⇒ Object
Returns the value of attribute virtual_tours.
5
6
7
|
# File 'lib/spark_api/models/listing.rb', line 5
def virtual_tours
@virtual_tours
end
|
Class Method Details
.company(arguments = {}) ⇒ Object
90
91
92
|
# File 'lib/spark_api/models/listing.rb', line 90
def self.company(arguments={})
collect(connection.get("/company/listings", arguments))
end
|
.find_by_cart_id(cart_id, options = {}) ⇒ Object
77
78
79
80
|
# File 'lib/spark_api/models/listing.rb', line 77
def self.find_by_cart_id(cart_id, options={})
query = {:_filter => "ListingCart Eq '#{cart_id}'"}
find(:all, options.merge(query))
end
|
.my(arguments = {}) ⇒ Object
82
83
84
|
# File 'lib/spark_api/models/listing.rb', line 82
def self.my(arguments={})
collect(connection.get("/my/listings", arguments))
end
|
.nearby(latitude, longitude, arguments = {}) ⇒ Object
94
95
96
97
|
# File 'lib/spark_api/models/listing.rb', line 94
def self.nearby(latitude, longitude, arguments={})
nearby_args = {:_lat => latitude, :_lon => longitude}.merge(arguments)
collect(connection.get("/listings/nearby", nearby_args))
end
|
.office(arguments = {}) ⇒ Object
86
87
88
|
# File 'lib/spark_api/models/listing.rb', line 86
def self.office(arguments={})
collect(connection.get("/office/listings", arguments))
end
|
.tour_of_homes(arguments = {}) ⇒ Object
99
100
101
|
# File 'lib/spark_api/models/listing.rb', line 99
def self.tour_of_homes(arguments={})
collect(connection.get("/listings/tourofhomes", arguments))
end
|
Instance Method Details
#delete_photos(photoIds, args = {}) ⇒ Object
252
253
254
255
256
257
258
259
260
261
262
263
264
265
|
# File 'lib/spark_api/models/listing.rb', line 252
def delete_photos(photoIds, args={})
unless photoIds.is_a? String
raise ArgumentError, "Batch photo delete failed. '#{photoIds}' is not a string."
end
begin
return delete_photos!(photoIds, args)
rescue BadResourceRequest => e
SparkApi.logger.warn { "Failed to delete photos from resource #{self}: #{e.message}" }
rescue NotFound => e
SparkApi.logger.error { "Failed to delete photos from resource #{self}: #{e.message}" }
end
false
end
|
#delete_photos!(photoIds, args = {}) ⇒ Object
248
249
250
|
# File 'lib/spark_api/models/listing.rb', line 248
def delete_photos!(photoIds, args={})
connection.delete subresource_path("photos") + "/#{photoIds}", args
end
|
#editable?(editable_settings = []) ⇒ Boolean
224
225
226
227
228
229
230
231
|
# File 'lib/spark_api/models/listing.rb', line 224
def editable?(editable_settings = [])
settings = Array(editable_settings)
editable = attributes.include?("Permissions") && self.Permissions["Editable"] == true
if editable
settings.each{ |setting| editable = false unless self.Permissions["EditableSettings"][setting.to_s] == true }
end
editable
end
|
#ExpirationDate ⇒ Object
233
234
235
|
# File 'lib/spark_api/models/listing.rb', line 233
def ExpirationDate
attributes["ExpirationDate"]
end
|
#ExpirationDate=(value) ⇒ Object
236
237
238
|
# File 'lib/spark_api/models/listing.rb', line 236
def ExpirationDate=(value)
write_attribute("ExpirationDate", value)
end
|
#full_address ⇒ Object
149
150
151
|
# File 'lib/spark_api/models/listing.rb', line 149
def full_address
"#{self.street_address}, #{self.region_address}".strip().gsub(/^,\s/, '').gsub(/,$/, '')
end
|
#my_notes ⇒ Object
119
120
121
122
123
124
|
# File 'lib/spark_api/models/listing.rb', line 119
def my_notes
Note.build_subclass.tap do |note|
note.prefix = "/listings/#{self.ListingKey}"
note.element_name = "/my/notes"
end
end
|
#region_address ⇒ Object
145
146
147
|
# File 'lib/spark_api/models/listing.rb', line 145
def region_address
"#{self.City}, #{self.StateOrProvince} #{self.PostalCode}".delete(DATA_MASK).strip().gsub(/^,\s/, '').gsub(/,$/, '')
end
|
#reorder_photo(photo_id, index) ⇒ Object
205
206
207
208
209
210
211
212
213
214
215
216
217
218
|
# File 'lib/spark_api/models/listing.rb', line 205
def reorder_photo(photo_id, index)
unless Integer(index)
raise ArgumentError, "Photo reorder failed. '#{index}' is not a number."
end
begin
return reorder_photo!(photo_id, index)
rescue BadResourceRequest => e
SparkApi.logger.warn { "Failed to save resource #{self}: #{e.message}" }
rescue NotFound => e
SparkApi.logger.error { "Failed to save resource #{self}: #{e.message}" }
end
false
end
|
#reorder_photo!(photo_id, index) ⇒ Object
219
220
221
222
|
# File 'lib/spark_api/models/listing.rb', line 219
def reorder_photo!(photo_id, index)
connection.put subresource_path("photos") + "/#{photo_id}", "Photos" => [{"Order"=>index}]
true
end
|
#reorder_photos(arguments = {}) ⇒ Object
190
191
192
193
194
195
196
197
198
199
|
# File 'lib/spark_api/models/listing.rb', line 190
def reorder_photos(arguments={})
begin
return reorder_photos!(arguments)
rescue BadResourceRequest => e
SparkApi.logger.warn { "Failed to save resource #{self}: #{e.message}" }
rescue NotFound => e
SparkApi.logger.error { "Failed to save resource #{self}: #{e.message}" }
end
false
end
|
#reorder_photos!(arguments = {}) ⇒ Object
200
201
202
203
|
# File 'lib/spark_api/models/listing.rb', line 200
def reorder_photos!(arguments={})
results = connection.put subresource_path("photos"), arguments
true
end
|
#respond_to?(method_symbol, include_all = false) ⇒ Boolean
240
241
242
243
244
245
246
|
# File 'lib/spark_api/models/listing.rb', line 240
def respond_to?(method_symbol, include_all=false)
if super
true
else
attributes['StandardFields'].include?(method_symbol.to_s) rescue false
end
end
|
#save(arguments = {}) ⇒ Object
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
|
# File 'lib/spark_api/models/listing.rb', line 153
def save(arguments={})
self.errors = []
begin
return save!(arguments)
rescue BadResourceRequest => e
self.errors << {:code => e.code, :message => e.message}
if e.code == 1053
@constraints = []
e.details.each do |detail|
detail.each_pair do |k,v|
v.each { |constraint| @constraints << Constraint.new(constraint)}
end
end
end
SparkApi.logger.warn { "Failed to save resource #{self}: #{e.message}" }
rescue NotFound => e
SparkApi.logger.error { "Failed to save resource #{self}: #{e.message}" }
end
false
end
|
#save!(arguments = {}) ⇒ Object
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
|
# File 'lib/spark_api/models/listing.rb', line 174
def save!(arguments={})
writable_changed_keys = changed & WRITEABLE_FIELDS
if writable_changed_keys.empty?
SparkApi.logger.warn { "No supported listing change detected" }
else
results = connection.put "/flexmls#{self.class.path}/#{self.Id}", build_hash(writable_changed_keys), arguments
@contstraints = []
results.details.each do |detail|
detail.each_pair do |k,v|
v.each { |constraint| @constraints << Constraint.new(constraint)}
end
end
end
true
end
|
#shared_notes(fore = nil) ⇒ Object
‘fore’ is required when accessing an agent’s shared notes for a specific contact. If the ApiUser /is/ the contact, then it can be inferred by the api, so it’s unecessary
130
131
132
133
134
135
136
137
138
139
|
# File 'lib/spark_api/models/listing.rb', line 130
def shared_notes(fore=nil)
Note.build_subclass.tap do |note|
note.prefix = "/listings/#{self.ListingKey}"
if fore.nil?
note.element_name = "/shared/notes"
else
note.element_name = "/shared/notes/contacts/#{fore}"
end
end
end
|
#street_address ⇒ Object
141
142
143
|
# File 'lib/spark_api/models/listing.rb', line 141
def street_address
(self.UnparsedFirstLineAddress || '').delete(DATA_MASK).strip().gsub(/\s{2,}/, ' ')
end
|