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, #load, #parse_id, #path, path, #persisted?, prefix, prefix=, #resource_uri, #respond_to?
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
|
# File 'lib/spark_api/models/listing.rb', line 11
def initialize(attributes={})
@photos = []
@videos = []
@virtual_tours = []
@rental_calendars = []
@documents = []
@constraints = []
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 pics != nil
pics.collect { |pic| @photos.push(Photo.new(pic)) }
attributes['StandardFields'].delete('Photos')
end
if vids != nil
vids.collect { |vid| @videos.push(Video.new(vid)) }
attributes['StandardFields'].delete('Videos')
end
if tours != nil
tours.collect { |tour| @virtual_tours.push(VirtualTour.new(tour)) }
attributes['StandardFields'].delete('VirtualTours')
end
if docs != nil
docs.collect { |doc| @documents.push(Document.new(doc)) }
attributes['StandardFields'].delete('Documents')
end
if ohouses != nil
@open_houses = []
ohouses.collect { |ohouse| @open_houses.push(OpenHouse.new(ohouse)) }
attributes['StandardFields'].delete('OpenHouses')
end
if tourhomes != nil
@tour_of_homes = []
tourhomes.collect { |tourhome| @tour_of_homes.push(TourOfHome.new(tourhome)) }
attributes['StandardFields'].delete('TourOfHomes')
end
if rentalcalendars != nil
rentalcalendars.collect { |rentalcalendar| @rental_calendars.push(RentalCalendar.new(rentalcalendar)) }
attributes.delete('RentalCalendar')
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
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
|
# File 'lib/spark_api/models/listing.rb', line 217
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
|
#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
81
82
83
|
# File 'lib/spark_api/models/listing.rb', line 81
def self.company(arguments={})
collect(connection.get("/company/listings", arguments))
end
|
.find_by_cart_id(cart_id, options = {}) ⇒ Object
68
69
70
71
|
# File 'lib/spark_api/models/listing.rb', line 68
def self.find_by_cart_id(cart_id, options={})
query = {:_filter => "ListingCart Eq '#{cart_id}'"}
find(:all, options.merge(query))
end
|
.my(arguments = {}) ⇒ Object
73
74
75
|
# File 'lib/spark_api/models/listing.rb', line 73
def self.my(arguments={})
collect(connection.get("/my/listings", arguments))
end
|
.nearby(latitude, longitude, arguments = {}) ⇒ Object
85
86
87
88
|
# File 'lib/spark_api/models/listing.rb', line 85
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
77
78
79
|
# File 'lib/spark_api/models/listing.rb', line 77
def self.office(arguments={})
collect(connection.get("/office/listings", arguments))
end
|
.tour_of_homes(arguments = {}) ⇒ Object
90
91
92
|
# File 'lib/spark_api/models/listing.rb', line 90
def self.tour_of_homes(arguments={})
collect(connection.get("/listings/tourofhomes", arguments))
end
|
Instance Method Details
#editable?(editable_settings = []) ⇒ Boolean
197
198
199
200
201
202
203
204
|
# File 'lib/spark_api/models/listing.rb', line 197
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
206
207
208
|
# File 'lib/spark_api/models/listing.rb', line 206
def ExpirationDate
attributes["ExpirationDate"]
end
|
#ExpirationDate=(value) ⇒ Object
209
210
211
|
# File 'lib/spark_api/models/listing.rb', line 209
def ExpirationDate=(value)
write_attribute("ExpirationDate", value)
end
|
#full_address ⇒ Object
141
142
143
|
# File 'lib/spark_api/models/listing.rb', line 141
def full_address
"#{self.street_address}, #{self.region_address}".strip().gsub(/^,\s/, '').gsub(/,$/, '')
end
|
#my_notes ⇒ Object
110
111
112
113
114
115
116
|
# File 'lib/spark_api/models/listing.rb', line 110
def my_notes
Note.build_subclass.tap do |note|
note.prefix = "/listings/#{self.ListingKey}"
note.element_name = "/my/notes"
SparkApi.logger.info("Note.path: #{note.path}")
end
end
|
#region_address ⇒ Object
137
138
139
|
# File 'lib/spark_api/models/listing.rb', line 137
def region_address
"#{self.City}, #{self.StateOrProvince} #{self.PostalCode}".delete(DATA_MASK).strip().gsub(/^,\s/, '').gsub(/,$/, '')
end
|
#reorder_photos(arguments = {}) ⇒ Object
182
183
184
185
186
187
188
189
190
191
|
# File 'lib/spark_api/models/listing.rb', line 182
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
192
193
194
195
|
# File 'lib/spark_api/models/listing.rb', line 192
def reorder_photos!(arguments={})
results = connection.put "#{self.class.path}/#{self.Id}/photos", arguments
true
end
|
#save(arguments = {}) ⇒ Object
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
|
# File 'lib/spark_api/models/listing.rb', line 145
def save(arguments={})
self.errors = []
begin
return save!(arguments)
rescue BadResourceRequest => e
self.errors << {:code => e.code, :message => e.message}
SparkApi.logger.debug("BHDEBUG: #{e.inspect}")
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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
|
# File 'lib/spark_api/models/listing.rb', line 166
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 "#{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
122
123
124
125
126
127
128
129
130
131
|
# File 'lib/spark_api/models/listing.rb', line 122
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
133
134
135
|
# File 'lib/spark_api/models/listing.rb', line 133
def street_address
"#{self.StreetNumber} #{self.StreetDirPrefix} #{self.StreetName} #{self.StreetSuffix} #{self.StreetDirSuffix} #{self.StreetAdditionalInfo}".delete(DATA_MASK).strip().gsub(/\s{2,}/, ' ')
end
|