nineflats-api 0.0.3 → 0.0.4
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.
- data/.gitignore +1 -0
- data/Gemfile +0 -4
- data/README.md +15 -0
- data/Rakefile +16 -3
- data/lib/nineflats-api/base.rb +7 -1
- data/lib/nineflats-api/calendar.rb +17 -0
- data/lib/nineflats-api/paginated_array.rb +10 -0
- data/lib/nineflats-api/photo.rb +17 -0
- data/lib/nineflats-api/place.rb +81 -7
- data/lib/nineflats-api/prices.rb +3 -4
- data/lib/nineflats-api/review.rb +18 -0
- data/lib/nineflats-api/user.rb +22 -8
- data/lib/nineflats-api/version.rb +1 -1
- data/nineflats-api.gemspec +5 -2
- data/spec/fixtures/place.json +66 -0
- data/spec/fixtures/place_calendar.json +47 -0
- data/spec/fixtures/place_photos.json +163 -0
- data/spec/fixtures/place_prices.json +29 -0
- data/spec/fixtures/place_reviews.json +23 -0
- data/spec/fixtures/search_result.json +612 -0
- data/spec/fixtures/user.json +19 -0
- data/spec/fixtures/user_favorites.json +472 -0
- data/spec/fixtures.rb +16 -0
- data/spec/place_calendar_spec.rb +39 -0
- data/spec/place_photos_spec.rb +55 -0
- data/spec/place_prices_spec.rb +67 -0
- data/spec/place_reviews_spec.rb +57 -0
- data/spec/place_spec.rb +13 -37
- data/spec/search_spec.rb +55 -0
- data/spec/spec_helper.rb +4 -4
- data/spec/user_spec.rb +52 -6
- metadata +76 -11
- data/.rvmrc +0 -1
- data/spec/fixtures/place.rb +0 -47
- data/spec/fixtures/place_prices.rb +0 -27
- data/spec/fixtures/user.rb +0 -17
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/README.md
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
Read about the API here: http://9flats.github.com/api_docs/
|
2
|
+
|
3
|
+
### How to update this gem
|
4
|
+
|
5
|
+
$ git clone git@github.com:9flats/nineflats-api.git
|
6
|
+
|
7
|
+
[make your changes]
|
8
|
+
|
9
|
+
$ git commit -am "my changes"
|
10
|
+
$ git push
|
11
|
+
$ rake install
|
12
|
+
$ gem push pkg/nineflats-api-0.0.3.gem
|
13
|
+
|
14
|
+
When you push a new gem version, update the [nineflats-api-example](https://github.com/9flats/nineflats-api-example) app to use the latest one. You need to change the version in the `Gemfile`, and you might to adapt the code, too.
|
15
|
+
|
data/Rakefile
CHANGED
@@ -1,5 +1,18 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
begin
|
3
|
+
Bundler.setup(:default, :development)
|
4
|
+
rescue Bundler::BundlerError => e
|
5
|
+
$stderr.puts e.message
|
6
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
7
|
+
exit e.status_code
|
8
|
+
end
|
9
|
+
|
10
|
+
require 'rake'
|
1
11
|
require "bundler/gem_tasks"
|
2
|
-
require 'rspec/core/rake_task'
|
3
12
|
|
4
|
-
|
5
|
-
|
13
|
+
require 'rspec/core'
|
14
|
+
require 'rspec/core/rake_task'
|
15
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
16
|
+
spec.pattern = FileList['spec/**/*_spec.rb']
|
17
|
+
end
|
18
|
+
task :default => 'spec'
|
data/lib/nineflats-api/base.rb
CHANGED
@@ -9,11 +9,17 @@ module Nineflats
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def self.base_url
|
12
|
-
"http://api.9flats.com/api"
|
12
|
+
"http://api.9flats.com/api/v1"
|
13
13
|
end
|
14
14
|
|
15
15
|
def self.api_call
|
16
16
|
raise "override me!"
|
17
17
|
end
|
18
|
+
|
19
|
+
def self.object_link(name, array)
|
20
|
+
link = array.select{ |link|
|
21
|
+
link["rel"] == name
|
22
|
+
}.first["href"]
|
23
|
+
end
|
18
24
|
end
|
19
25
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Nineflats
|
2
|
+
class Calendar < Base
|
3
|
+
attr_accessor :year, :month, :days
|
4
|
+
|
5
|
+
def initialize(json)
|
6
|
+
calendar = json.first[1]
|
7
|
+
|
8
|
+
@year = calendar["year"]
|
9
|
+
@month = calendar["month"]
|
10
|
+
@days = calendar["days"]
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.api_call(slug, year, month)
|
14
|
+
base_url + "/places/#{slug}/calendar/#{year}/#{month}?client_id=#{Nineflats::Base.client_app_key}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Nineflats
|
2
|
+
class Photo < Base
|
3
|
+
attr_accessor :title, :caption, :url
|
4
|
+
|
5
|
+
def initialize(json)
|
6
|
+
photo = json.first[1]
|
7
|
+
|
8
|
+
@title = photo["title"]
|
9
|
+
@caption = photo["caption"]
|
10
|
+
@url = photo["url"]
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.api_call(slug)
|
14
|
+
base_url + "/places/#{slug}/photos?client_id=#{Nineflats::Base.client_app_key}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/nineflats-api/place.rb
CHANGED
@@ -6,8 +6,10 @@ module Nineflats
|
|
6
6
|
:size, :house_rules, :pets_around, :bathroom_type, :cleaning_fee,
|
7
7
|
:charge_per_extra_person_limit, :favorites_count, :amenities_list,
|
8
8
|
:featured_photo_url, :price, :charge_per_extra_person, :country,
|
9
|
-
:category, :place_type, :bed_type, :bathroom_type,
|
10
|
-
:host, :self_url, :full_url, :
|
9
|
+
:category, :place_type, :bed_type, :bathroom_type, :description,
|
10
|
+
:host, :self_url, :full_url, :photos_url, :prices_url, :reviews_url,
|
11
|
+
:calendar_current_month_url, :calendar_next_month_url,
|
12
|
+
:prices, :reviews, :photos
|
11
13
|
|
12
14
|
def initialize(json)
|
13
15
|
place = json.first[1]
|
@@ -41,11 +43,49 @@ module Nineflats
|
|
41
43
|
@lat = place["lat"]
|
42
44
|
@lng = place["lng"]
|
43
45
|
@district = place["district"]
|
46
|
+
@description = place["description"]
|
44
47
|
|
45
|
-
@host = User.new({"user"=>place["host"]})
|
48
|
+
@host = User.new({"user" => place["host"]})
|
46
49
|
|
47
|
-
@self_url
|
48
|
-
@full_url
|
50
|
+
@self_url = Nineflats::Base.object_link("self", place["links"])
|
51
|
+
@full_url = Nineflats::Base.object_link("full", place["links"])
|
52
|
+
@photos_url = Nineflats::Base.object_link("photos", place["links"])
|
53
|
+
@prices_url = Nineflats::Base.object_link("prices", place["links"])
|
54
|
+
@reviews_url = Nineflats::Base.object_link("reviews", place["links"])
|
55
|
+
@calendar_current_month_url = Nineflats::Base.object_link("calendar: current month", place["links"])
|
56
|
+
@calendar_next_month_url = Nineflats::Base.object_link("calendar: next month", place["links"])
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.search(params = nil)
|
60
|
+
params ||= {}
|
61
|
+
|
62
|
+
queries = params.collect do |key, value|
|
63
|
+
"&search[#{key}]=#{value}"
|
64
|
+
end
|
65
|
+
|
66
|
+
search_url = base_url + "/places?client_id=#{Nineflats::Base.client_app_key}" + queries.join
|
67
|
+
|
68
|
+
Place.search_result(search_url)
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.search_result(search_url)
|
72
|
+
json = Helpers.get_data(search_url)
|
73
|
+
|
74
|
+
places = json["places"].collect do |place_json|
|
75
|
+
Place.new(place_json)
|
76
|
+
end
|
77
|
+
|
78
|
+
result = Nineflats::PaginatedArray.new(places)
|
79
|
+
|
80
|
+
result.total_entries = json["total_entries"]
|
81
|
+
result.total_pages = json["total_pages"]
|
82
|
+
result.current_page = json["current_page"]
|
83
|
+
result.per_page = json["per_page"]
|
84
|
+
|
85
|
+
result.self_url = Nineflats::Base.object_link("self", json["links"])
|
86
|
+
result.full_url = Nineflats::Base.object_link("full", json["links"])
|
87
|
+
result.next_page_url = Nineflats::Base.object_link("next_page", json["links"])
|
88
|
+
result
|
49
89
|
end
|
50
90
|
|
51
91
|
def self.fetch(slug, lang)
|
@@ -53,11 +93,45 @@ module Nineflats
|
|
53
93
|
end
|
54
94
|
|
55
95
|
def prices
|
56
|
-
@prices
|
96
|
+
return @prices if @prices
|
97
|
+
|
98
|
+
json = Helpers.get_data(Prices.api_call(slug))
|
99
|
+
|
100
|
+
@prices = Prices.new(json) if json && json["place_prices"]
|
101
|
+
end
|
102
|
+
|
103
|
+
def reviews
|
104
|
+
return @reviews if @reviews
|
105
|
+
|
106
|
+
json = Helpers.get_data(Review.api_call(slug))
|
107
|
+
|
108
|
+
if json && json["reviews"]
|
109
|
+
@reviews = json["reviews"].collect do |review_hash|
|
110
|
+
Review.new(review_hash)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def photos
|
116
|
+
return @photos if @photos
|
117
|
+
|
118
|
+
json = Helpers.get_data(Photo.api_call(slug))
|
119
|
+
|
120
|
+
if json && json["place_photos"]
|
121
|
+
@photos = json["place_photos"].collect do |photo_hash|
|
122
|
+
Photo.new(photo_hash)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def calendar(year, month)
|
128
|
+
json = Helpers.get_data(Calendar.api_call(slug, year, month))
|
129
|
+
|
130
|
+
Calendar.new(json) if json && json["calendar"]
|
57
131
|
end
|
58
132
|
|
59
133
|
def self.api_call(slug, lang)
|
60
|
-
base_url + "/places/#{slug}
|
134
|
+
base_url + "/places/#{slug}?client_id=#{Nineflats::Base.client_app_key}&lang=#{lang}"
|
61
135
|
end
|
62
136
|
end
|
63
137
|
end
|
data/lib/nineflats-api/prices.rb
CHANGED
@@ -13,14 +13,13 @@ module Nineflats
|
|
13
13
|
@weekly_discount_in_percent = prices["weekly_discount_in_percent"]
|
14
14
|
@monthly_discount_in_percent = prices["monthly_discount_in_percent"]
|
15
15
|
|
16
|
-
@seasons = []
|
17
|
-
|
18
|
-
@seasons << Season.new(season)
|
16
|
+
@seasons = prices["seasons"].collect do |season|
|
17
|
+
Season.new(season)
|
19
18
|
end
|
20
19
|
end
|
21
20
|
|
22
21
|
def self.api_call(slug)
|
23
|
-
base_url + "/places/#{slug}/prices
|
22
|
+
base_url + "/places/#{slug}/prices?client_id=#{Nineflats::Base.client_app_key}"
|
24
23
|
end
|
25
24
|
end
|
26
25
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Nineflats
|
2
|
+
class Review < Base
|
3
|
+
attr_accessor :user_text, :place_text, :place_stars, :language
|
4
|
+
|
5
|
+
def initialize(json)
|
6
|
+
review = json.first[1]
|
7
|
+
|
8
|
+
@user_text = review["user_text"]
|
9
|
+
@place_text = review["place_text"]
|
10
|
+
@place_stars = review["place_stars"]
|
11
|
+
@language = review["language"]
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.api_call(slug)
|
15
|
+
base_url + "/places/#{slug}/reviews?client_id=#{Nineflats::Base.client_app_key}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/nineflats-api/user.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module Nineflats
|
2
2
|
class User < Base
|
3
|
-
attr_accessor :name, :slug, :user_photo_url, :
|
3
|
+
attr_accessor :name, :slug, :user_photo_url, :favorites,
|
4
|
+
:self_url, :favorites_url, :full_url
|
4
5
|
|
5
6
|
def initialize(json)
|
6
7
|
user = json.first[1]
|
@@ -10,17 +11,30 @@ module Nineflats
|
|
10
11
|
@user_photo_url = user["user_photo_url"]
|
11
12
|
|
12
13
|
if user["links"]
|
13
|
-
@self_url
|
14
|
-
@
|
14
|
+
@self_url = Nineflats::Base.object_link("self", user["links"])
|
15
|
+
@full_url = Nineflats::Base.object_link("full", user["links"])
|
16
|
+
@favorites_url = Nineflats::Base.object_link("favorites", user["links"])
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def favorites
|
21
|
+
return @favorites if @favorites
|
22
|
+
|
23
|
+
json = Helpers.get_data(favorites_url)
|
24
|
+
|
25
|
+
if json && json["places"]
|
26
|
+
@favorites = json["places"].collect do |place_hash|
|
27
|
+
Place.new(place_hash)
|
28
|
+
end
|
15
29
|
end
|
16
30
|
end
|
17
31
|
|
18
|
-
def self.fetch(slug
|
19
|
-
User.new(Helpers.get_data(User.api_call(slug
|
32
|
+
def self.fetch(slug)
|
33
|
+
User.new(Helpers.get_data(User.api_call(slug)))
|
20
34
|
end
|
21
|
-
|
22
|
-
def self.api_call(slug
|
23
|
-
base_url + "/users/#{slug}
|
35
|
+
|
36
|
+
def self.api_call(slug)
|
37
|
+
base_url + "/users/#{slug}?client_id=#{Nineflats::Base.client_app_key}"
|
24
38
|
end
|
25
39
|
end
|
26
40
|
end
|
data/nineflats-api.gemspec
CHANGED
@@ -11,10 +11,13 @@ Gem::Specification.new do |s|
|
|
11
11
|
s.summary = %q{9flats API}
|
12
12
|
s.description = %q{Let's you use the 9flats API'}
|
13
13
|
|
14
|
-
s.rubyforge_project = "nineflats-api"
|
15
|
-
|
16
14
|
s.files = `git ls-files`.split("\n")
|
17
15
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
16
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
17
|
+
|
19
18
|
s.require_paths = ["lib"]
|
19
|
+
|
20
|
+
s.add_development_dependency('rake', '~> 0.9.0')
|
21
|
+
s.add_development_dependency('rspec')
|
22
|
+
s.add_development_dependency('fakeweb')
|
20
23
|
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
{
|
2
|
+
"place": {
|
3
|
+
"name": "Great river view, Colorful and Cozy",
|
4
|
+
"city": "Lisboa",
|
5
|
+
"slug": "apt-no-centro-histrico-de-lisboa",
|
6
|
+
"zipcode": "1100-188",
|
7
|
+
"number_of_beds": 4,
|
8
|
+
"number_of_bedrooms": 1,
|
9
|
+
"currency": "EUR",
|
10
|
+
"lat": 38.7173993,
|
11
|
+
"lng": -9.1204621,
|
12
|
+
"district": "",
|
13
|
+
"number_of_bathrooms": 1,
|
14
|
+
"minimum_nights": 2,
|
15
|
+
"maximum_nights": 365,
|
16
|
+
"bed_type": "Real bed",
|
17
|
+
"size": 70.0,
|
18
|
+
"house_rules": "",
|
19
|
+
"pets_around": false,
|
20
|
+
"bathroom_type": "Private",
|
21
|
+
"cleaning_fee": null,
|
22
|
+
"charge_per_extra_person_limit": 4,
|
23
|
+
"favorites_count": 5,
|
24
|
+
"amenities_list": ["Internet", "Wifi (Wireless LAN)", "TV", "Air Conditioning", "Kitchen", "Washer", "Smoking allowed", "Family/Kid friendly", "Pets allowed", "Balcony", "Dishwasher", "Fridge/freezer", "Shower/bathtub", "Baby crib", "Final cleaning", "Panoramic view", "Gay friendly"],
|
25
|
+
"featured_photo_url": "http://img1.9flats.com/place_photos/photos/62387-1311446301/medium.jpg",
|
26
|
+
"description": "Panoramic terrace in the historic center of Lisbon, close to Subway and Airport",
|
27
|
+
"price": 90.0,
|
28
|
+
"charge_per_extra_person": 20.0,
|
29
|
+
"content_language": "en",
|
30
|
+
"country": "Portugal",
|
31
|
+
"category": "Apartment",
|
32
|
+
"place_type": "Entire place",
|
33
|
+
"links": [{
|
34
|
+
"rel": "self",
|
35
|
+
"href": "http://api.9flats.com/api/v1/places/apt-no-centro-histrico-de-lisboa?client_id=WfKWrPywnEbMhlifGlrsLu2ULfvTwxrKQji5eg0S"
|
36
|
+
},
|
37
|
+
{
|
38
|
+
"rel": "full",
|
39
|
+
"href": "http://www.9flats.com/places/apt-no-centro-histrico-de-lisboa"
|
40
|
+
},
|
41
|
+
{
|
42
|
+
"rel": "photos",
|
43
|
+
"href": "http://api.9flats.com/api/v1/places/apt-no-centro-histrico-de-lisboa/photos?client_id=WfKWrPywnEbMhlifGlrsLu2ULfvTwxrKQji5eg0S"
|
44
|
+
},
|
45
|
+
{
|
46
|
+
"rel": "prices",
|
47
|
+
"href": "http://api.9flats.com/api/v1/places/apt-no-centro-histrico-de-lisboa/prices?client_id=WfKWrPywnEbMhlifGlrsLu2ULfvTwxrKQji5eg0S"
|
48
|
+
},
|
49
|
+
{
|
50
|
+
"rel": "reviews",
|
51
|
+
"href": "http://api.9flats.com/api/v1/places/apt-no-centro-histrico-de-lisboa/reviews?client_id=WfKWrPywnEbMhlifGlrsLu2ULfvTwxrKQji5eg0S"
|
52
|
+
},
|
53
|
+
{
|
54
|
+
"rel": "calendar: current month",
|
55
|
+
"href": "http://api.9flats.com/api/v1/places/apt-no-centro-histrico-de-lisboa/calendar/2011/10?client_id=WfKWrPywnEbMhlifGlrsLu2ULfvTwxrKQji5eg0S"
|
56
|
+
},
|
57
|
+
{
|
58
|
+
"rel": "calendar: next month",
|
59
|
+
"href": "http://api.9flats.com/api/v1/places/apt-no-centro-histrico-de-lisboa/calendar/2011/11?client_id=WfKWrPywnEbMhlifGlrsLu2ULfvTwxrKQji5eg0S"
|
60
|
+
}],
|
61
|
+
"host": {
|
62
|
+
"name": "Paulo M.",
|
63
|
+
"slug": "paulo-m"
|
64
|
+
}
|
65
|
+
}
|
66
|
+
}
|
@@ -0,0 +1,47 @@
|
|
1
|
+
{
|
2
|
+
"calendar": {
|
3
|
+
"year": 2011,
|
4
|
+
"month": 10,
|
5
|
+
"days": {
|
6
|
+
"1": true,
|
7
|
+
"2": true,
|
8
|
+
"3": true,
|
9
|
+
"4": true,
|
10
|
+
"5": false,
|
11
|
+
"6": false,
|
12
|
+
"7": false,
|
13
|
+
"8": false,
|
14
|
+
"9": true,
|
15
|
+
"10": false,
|
16
|
+
"11": true,
|
17
|
+
"12": true,
|
18
|
+
"13": true,
|
19
|
+
"14": true,
|
20
|
+
"15": true,
|
21
|
+
"16": true,
|
22
|
+
"17": true,
|
23
|
+
"18": true,
|
24
|
+
"19": true,
|
25
|
+
"20": false,
|
26
|
+
"21": false,
|
27
|
+
"22": false,
|
28
|
+
"23": true,
|
29
|
+
"24": false,
|
30
|
+
"25": true,
|
31
|
+
"26": true,
|
32
|
+
"27": true,
|
33
|
+
"28": true,
|
34
|
+
"29": true,
|
35
|
+
"30": true,
|
36
|
+
"31": false
|
37
|
+
}
|
38
|
+
},
|
39
|
+
"links": [{
|
40
|
+
"rel": "self",
|
41
|
+
"href": "http://www.9flats.com/api/v1/places/harmony-villas-close-to-the-sea/calendar/2011/10?client_id=WfKWrPywnEbMhlifGlrsLu2ULfvTwxrKQji5eg0S"
|
42
|
+
},
|
43
|
+
{
|
44
|
+
"rel": "calendar: next month",
|
45
|
+
"href": "http://www.9flats.com/api/v1/places/harmony-villas-close-to-the-sea/calendar/2011/11?client_id=WfKWrPywnEbMhlifGlrsLu2ULfvTwxrKQji5eg0S"
|
46
|
+
}]
|
47
|
+
}
|
@@ -0,0 +1,163 @@
|
|
1
|
+
{
|
2
|
+
"place_photos": [
|
3
|
+
{
|
4
|
+
"place_photo": {
|
5
|
+
"title": "Terrace with National Pantheon view",
|
6
|
+
"caption": null,
|
7
|
+
"url": "http://img2.9flats.com/place_photos/photos/62387-1311446301/large.jpg"
|
8
|
+
}
|
9
|
+
},
|
10
|
+
{
|
11
|
+
"place_photo": {
|
12
|
+
"title": "Terrace with river Tagus view",
|
13
|
+
"caption": null,
|
14
|
+
"url": "http://img3.9flats.com/place_photos/photos/62388-1311446306/large.jpg"
|
15
|
+
}
|
16
|
+
},
|
17
|
+
{
|
18
|
+
"place_photo": {
|
19
|
+
"title": "Family room with removable dining table",
|
20
|
+
"caption": null,
|
21
|
+
"url": "http://img3.9flats.com/place_photos/photos/62389-1311446311/large.jpg"
|
22
|
+
}
|
23
|
+
},
|
24
|
+
{
|
25
|
+
"place_photo": {
|
26
|
+
"title": "Family room with river view",
|
27
|
+
"caption": null,
|
28
|
+
"url": "http://img0.9flats.com/place_photos/photos/62390-1311446315/large.jpg"
|
29
|
+
}
|
30
|
+
},
|
31
|
+
{
|
32
|
+
"place_photo": {
|
33
|
+
"title": "Double room with river view",
|
34
|
+
"caption": null,
|
35
|
+
"url": "http://img2.9flats.com/place_photos/photos/62391-1311446320/large.jpg"
|
36
|
+
}
|
37
|
+
},
|
38
|
+
{
|
39
|
+
"place_photo": {
|
40
|
+
"title": "Double room with big wardrobes",
|
41
|
+
"caption": null,
|
42
|
+
"url": "http://img1.9flats.com/place_photos/photos/62392-1311446325/large.jpg"
|
43
|
+
}
|
44
|
+
},
|
45
|
+
{
|
46
|
+
"place_photo": {
|
47
|
+
"title": "Kitchen with fridge freezer",
|
48
|
+
"caption": null,
|
49
|
+
"url": "http://img2.9flats.com/place_photos/photos/62393-1311446330/large.jpg"
|
50
|
+
}
|
51
|
+
},
|
52
|
+
{
|
53
|
+
"place_photo": {
|
54
|
+
"title": "Kitchen fully equipped",
|
55
|
+
"caption": null,
|
56
|
+
"url": "http://img0.9flats.com/place_photos/photos/62394-1311446334/large.jpg"
|
57
|
+
}
|
58
|
+
},
|
59
|
+
{
|
60
|
+
"place_photo": {
|
61
|
+
"title": "Bathroom",
|
62
|
+
"caption": null,
|
63
|
+
"url": "http://img1.9flats.com/place_photos/photos/62395-1311446339/large.jpg"
|
64
|
+
}
|
65
|
+
},
|
66
|
+
{
|
67
|
+
"place_photo": {
|
68
|
+
"title": "Family room with French doors",
|
69
|
+
"caption": null,
|
70
|
+
"url": "http://img1.9flats.com/place_photos/photos/62396-1311446344/large.jpg"
|
71
|
+
}
|
72
|
+
},
|
73
|
+
{
|
74
|
+
"place_photo": {
|
75
|
+
"title": "Terrace with National Pantheon view",
|
76
|
+
"caption": null,
|
77
|
+
"url": "http://img1.9flats.com/place_photos/photos/62397-1311446348/large.jpg"
|
78
|
+
}
|
79
|
+
},
|
80
|
+
{
|
81
|
+
"place_photo": {
|
82
|
+
"title": "Terrace with panoramic view",
|
83
|
+
"caption": null,
|
84
|
+
"url": "http://img3.9flats.com/place_photos/photos/62398-1311446353/large.jpg"
|
85
|
+
}
|
86
|
+
},
|
87
|
+
{
|
88
|
+
"place_photo": {
|
89
|
+
"title": "Night view",
|
90
|
+
"caption": null,
|
91
|
+
"url": "http://img3.9flats.com/place_photos/photos/62399-1311446357/large.jpg"
|
92
|
+
}
|
93
|
+
},
|
94
|
+
{
|
95
|
+
"place_photo": {
|
96
|
+
"title": "Cruise at night view",
|
97
|
+
"caption": null,
|
98
|
+
"url": "http://img0.9flats.com/place_photos/photos/62400-1311446362/large.jpg"
|
99
|
+
}
|
100
|
+
},
|
101
|
+
{
|
102
|
+
"place_photo": {
|
103
|
+
"title": "Double room with full mirror",
|
104
|
+
"caption": null,
|
105
|
+
"url": "http://img0.9flats.com/place_photos/photos/62401-1311446366/large.jpg"
|
106
|
+
}
|
107
|
+
},
|
108
|
+
{
|
109
|
+
"place_photo": {
|
110
|
+
"title": "Hall",
|
111
|
+
"caption": null,
|
112
|
+
"url": "http://img3.9flats.com/place_photos/photos/62402-1311446371/large.jpg"
|
113
|
+
}
|
114
|
+
},
|
115
|
+
{
|
116
|
+
"place_photo": {
|
117
|
+
"title": "Family room with TV, DVD and Stereo",
|
118
|
+
"caption": null,
|
119
|
+
"url": "http://img1.9flats.com/place_photos/photos/62403-1311446376/large.jpg"
|
120
|
+
}
|
121
|
+
},
|
122
|
+
{
|
123
|
+
"place_photo": {
|
124
|
+
"title": "Family room with sofa bed",
|
125
|
+
"caption": null,
|
126
|
+
"url": "http://img2.9flats.com/place_photos/photos/62404-1311446380/large.jpg"
|
127
|
+
}
|
128
|
+
},
|
129
|
+
{
|
130
|
+
"place_photo": {
|
131
|
+
"title": "Double room with French doors",
|
132
|
+
"caption": null,
|
133
|
+
"url": "http://img2.9flats.com/place_photos/photos/62405-1311446385/large.jpg"
|
134
|
+
}
|
135
|
+
},
|
136
|
+
{
|
137
|
+
"place_photo": {
|
138
|
+
"title": "Double room with terrace access",
|
139
|
+
"caption": null,
|
140
|
+
"url": "http://img3.9flats.com/place_photos/photos/62406-1311446389/large.jpg"
|
141
|
+
}
|
142
|
+
},
|
143
|
+
{
|
144
|
+
"place_photo": {
|
145
|
+
"title": "Terrace with river Tagus view",
|
146
|
+
"caption": null,
|
147
|
+
"url": "http://img2.9flats.com/place_photos/photos/62407-1311446394/large.jpg"
|
148
|
+
}
|
149
|
+
},
|
150
|
+
{
|
151
|
+
"place_photo": {
|
152
|
+
"title": "Terrace with river Tagus view",
|
153
|
+
"caption": null,
|
154
|
+
"url": "http://img0.9flats.com/place_photos/photos/62408-1311446399/large.jpg"
|
155
|
+
}
|
156
|
+
}
|
157
|
+
],
|
158
|
+
"total_entries": 22,
|
159
|
+
"links": [{
|
160
|
+
"rel": "self",
|
161
|
+
"href": "http://api.9flats.com/api/v1/places/harmony-villas-close-to-the-sea/photos?client_id=WfKWrPywnEbMhlifGlrsLu2ULfvTwxrKQji5eg0S"
|
162
|
+
}]
|
163
|
+
}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
{
|
2
|
+
"place_prices": {
|
3
|
+
"currency": "EUR",
|
4
|
+
"default_price": 90.0,
|
5
|
+
"weekend_night_price": 90.0,
|
6
|
+
"weekly_discount_in_percent": 5.55,
|
7
|
+
"monthly_discount_in_percent": 11.11,
|
8
|
+
"seasons": [{
|
9
|
+
"season": {
|
10
|
+
"from": "2011-09-05",
|
11
|
+
"to": "2011-09-30",
|
12
|
+
"price": 100.0,
|
13
|
+
"weekend_night_price": 110.0
|
14
|
+
}
|
15
|
+
},
|
16
|
+
{
|
17
|
+
"season": {
|
18
|
+
"from": "2011-10-01",
|
19
|
+
"to": "2011-10-31",
|
20
|
+
"price": 75.0,
|
21
|
+
"weekend_night_price": 75.0
|
22
|
+
}
|
23
|
+
}]
|
24
|
+
},
|
25
|
+
"links": [{
|
26
|
+
"rel": "self",
|
27
|
+
"href": "http://api.9flats.com/api/v1/places/harmony-villas-close-to-the-sea/prices?client_id=WfKWrPywnEbMhlifGlrsLu2ULfvTwxrKQji5eg0S"
|
28
|
+
}]
|
29
|
+
}
|