Class: FlexmlsApi::Models::Listing
- Inherits:
-
Base
- Object
- Base
- FlexmlsApi::Models::Listing
show all
- Extended by:
- Finders
- Defined in:
- lib/flexmls_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, #changed, #errors
Class Method Summary
collapse
Instance Method Summary
collapse
Methods included from Finders
find, first, last
Methods inherited from Base
#connection, connection, count, element_name, element_name=, first, get, #load, #parse_id, path, prefix, prefix=, #respond_to?
Methods included from Paginate
#collect, #paginate, #per_page
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
|
# File 'lib/flexmls_api/models/listing.rb', line 11
def initialize(attributes={})
@photos = []
@videos = []
@virtual_tours = []
@documents = []
@constraints = []
if attributes.has_key?('StandardFields')
pics, vids, tours, docs = attributes['StandardFields'].values_at('Photos','Videos', 'VirtualTours', 'Documents')
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
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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
|
# File 'lib/flexmls_api/models/listing.rb', line 169
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/flexmls_api/models/listing.rb', line 6
def constraints
@constraints
end
|
#documents ⇒ Object
Returns the value of attribute documents.
5
6
7
|
# File 'lib/flexmls_api/models/listing.rb', line 5
def documents
@documents
end
|
#photos ⇒ Object
Returns the value of attribute photos.
5
6
7
|
# File 'lib/flexmls_api/models/listing.rb', line 5
def photos
@photos
end
|
#videos ⇒ Object
Returns the value of attribute videos.
5
6
7
|
# File 'lib/flexmls_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/flexmls_api/models/listing.rb', line 5
def virtual_tours
@virtual_tours
end
|
Class Method Details
.company(arguments = {}) ⇒ Object
58
59
60
|
# File 'lib/flexmls_api/models/listing.rb', line 58
def self.company(arguments={})
collect(connection.get("/company/listings", arguments))
end
|
.find_by_cart_id(cart_id, options = {}) ⇒ Object
45
46
47
48
|
# File 'lib/flexmls_api/models/listing.rb', line 45
def self.find_by_cart_id(cart_id, options={})
query = {:_filter => "ListingCart Eq '#{cart_id}'"}
find(:all, options.merge(query))
end
|
.my(arguments = {}) ⇒ Object
50
51
52
|
# File 'lib/flexmls_api/models/listing.rb', line 50
def self.my(arguments={})
collect(connection.get("/my/listings", arguments))
end
|
.nearby(latitude, longitude, arguments = {}) ⇒ Object
62
63
64
65
|
# File 'lib/flexmls_api/models/listing.rb', line 62
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
54
55
56
|
# File 'lib/flexmls_api/models/listing.rb', line 54
def self.office(arguments={})
collect(connection.get("/office/listings", arguments))
end
|
Instance Method Details
#editable?(editable_settings = []) ⇒ Boolean
149
150
151
152
153
154
155
156
|
# File 'lib/flexmls_api/models/listing.rb', line 149
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
158
159
160
|
# File 'lib/flexmls_api/models/listing.rb', line 158
def ExpirationDate
attributes["ExpirationDate"]
end
|
#ExpirationDate=(value) ⇒ Object
161
162
163
|
# File 'lib/flexmls_api/models/listing.rb', line 161
def ExpirationDate=(value)
write_attribute("ExpirationDate", value)
end
|
#full_address ⇒ Object
108
109
110
|
# File 'lib/flexmls_api/models/listing.rb', line 108
def full_address
"#{self.street_address}, #{self.region_address}".strip().gsub(/^,\s/, '').gsub(/,$/, '')
end
|
#my_notes ⇒ Object
77
78
79
80
81
82
83
|
# File 'lib/flexmls_api/models/listing.rb', line 77
def my_notes
Note.build_subclass.tap do |note|
note.prefix = "/listings/#{self.ListingKey}"
note.element_name = "/my/notes"
FlexmlsApi.logger.info("Note.path: #{note.path}")
end
end
|
#open_houses(arguments = {}) ⇒ Object
72
73
74
75
|
# File 'lib/flexmls_api/models/listing.rb', line 72
def open_houses(arguments={})
return @open_houses unless @open_houses.nil?
@open_houses = OpenHouse.find_by_listing_key(self.Id, arguments)
end
|
#region_address ⇒ Object
104
105
106
|
# File 'lib/flexmls_api/models/listing.rb', line 104
def region_address
"#{self.City}, #{self.StateOrProvince} #{self.PostalCode}".delete(DATA_MASK).strip().gsub(/^,\s/, '').gsub(/,$/, '')
end
|
#save(arguments = {}) ⇒ Object
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
# File 'lib/flexmls_api/models/listing.rb', line 112
def save(arguments={})
self.errors = []
begin
return save!(arguments)
rescue BadResourceRequest => e
self.errors << {:code => e.code, :message => e.message}
FlexmlsApi.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
FlexmlsApi.logger.error("Failed to save resource #{self}: #{e.message}")
rescue NotFound => e
FlexmlsApi.logger.error("Failed to save resource #{self}: #{e.message}")
end
false
end
|
#save!(arguments = {}) ⇒ Object
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
# File 'lib/flexmls_api/models/listing.rb', line 133
def save!(arguments={})
writable_changed_keys = changed & WRITEABLE_FIELDS
if writable_changed_keys.empty?
FlexmlsApi.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
89
90
91
92
93
94
95
96
97
98
|
# File 'lib/flexmls_api/models/listing.rb', line 89
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
100
101
102
|
# File 'lib/flexmls_api/models/listing.rb', line 100
def street_address
"#{self.StreetNumber} #{self.StreetDirPrefix} #{self.StreetName} #{self.StreetSuffix} #{self.StreetDirSuffix} #{self.StreetAdditionalInfo}".delete(DATA_MASK).strip().gsub(/\s{2,}/, ' ')
end
|
#tour_of_homes(arguments = {}) ⇒ Object
67
68
69
70
|
# File 'lib/flexmls_api/models/listing.rb', line 67
def tour_of_homes(arguments={})
return @tour_of_homes unless @tour_of_homes.nil?
@tour_of_homes = TourOfHome.find_by_listing_key(self.Id, arguments)
end
|