bookingsync_portal 0.1.2 → 0.2.0
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 +4 -4
- data/README.md +123 -2
- data/app/assets/javascripts/bookingsync_portal/admin/handle_remote_errors.js.coffee +1 -1
- data/app/models/bookingsync_portal/account.rb +5 -0
- data/app/models/bookingsync_portal/photo.rb +8 -0
- data/app/models/bookingsync_portal/rate.rb +6 -0
- data/app/models/bookingsync_portal/rental.rb +8 -2
- data/app/resources/bookingsync_portal/admin_api/connection_resource.rb +1 -1
- data/app/resources/bookingsync_portal/admin_api/remote_account_resource.rb +1 -1
- data/app/resources/bookingsync_portal/admin_api/remote_rental_resource.rb +0 -2
- data/app/resources/bookingsync_portal/admin_api/rental_resource.rb +0 -2
- data/app/views/bookingsync_portal/admin/rentals/_remote_rental.html.erb +1 -1
- data/app/views/bookingsync_portal/admin/rentals/index.html.erb +1 -1
- data/config/locales/en.yml +1 -0
- data/db/migrate/20150222172825_create_accounts.rb +6 -2
- data/db/migrate/20150222173413_create_rentals.rb +1 -1
- data/db/migrate/20150222173711_create_remote_accounts.rb +1 -1
- data/db/migrate/20150222174023_create_remote_rentals.rb +1 -1
- data/db/migrate/20150222174234_create_connections.rb +2 -1
- data/db/migrate/20150520134912_create_photos.rb +13 -0
- data/db/migrate/20150521091056_create_rates.rb +12 -0
- data/lib/bookingsync_portal.rb +9 -1
- data/lib/bookingsync_portal/version.rb +1 -1
- data/lib/generators/bookingsync_portal/install_generator.rb +10 -3
- data/lib/generators/templates/{bookingsync_portal.rb → initializers/bookingsync_portal.rb} +11 -6
- data/lib/generators/templates/models/account.rb +14 -0
- data/lib/generators/templates/models/connection.rb +2 -0
- data/lib/generators/templates/models/photo.rb +4 -0
- data/lib/generators/templates/models/rate.rb +3 -0
- data/lib/generators/templates/models/remote_account.rb +6 -0
- data/lib/generators/templates/models/remote_rental.rb +6 -0
- data/lib/generators/templates/models/rental.rb +6 -0
- metadata +23 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7bce44a09e365af14bee6025bdbaf505b5cbaa3e
|
4
|
+
data.tar.gz: 672dc73f92f93d0d3e0d9aa18199b73b201d7ded
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cb08b602aef04800fd3608c2db757bb2b8d5b8aa0ae62611d4bfe66c4926638511476a4401ebe22684ed15b5c0b434ccab5d8f45f94990038b4d0acfbf44b749
|
7
|
+
data.tar.gz: d0026be5f43c6fe11bd6b240f36f719ef0eecc243468a116433e3b23e179dbe16401dc70cb33d61edb3678913b3bb957be8b1c0049f3b73767d847fccb8d54b9
|
data/README.md
CHANGED
@@ -1,8 +1,85 @@
|
|
1
|
+
[](https://codeclimate.com/github/BookingSync/bookingsync_portal)
|
2
|
+
[](https://travis-ci.org/BookingSync/bookingsync_portal)
|
3
|
+
|
1
4
|
# BookingsyncPortal
|
2
5
|
|
3
|
-
|
6
|
+
A Rails engine to simplify building BookingSync Portal Applications.
|
7
|
+
|
8
|
+
## Requirements
|
9
|
+
|
10
|
+
This engine requires Rails `>= 4.0.0` and Ruby `>= 2.0.0`.
|
11
|
+
|
12
|
+
## Documentation
|
13
|
+
|
14
|
+
[API documentation is available at rdoc.info](http://rdoc.info/github/BookingSync/bookingsync_portal/master/frames).
|
15
|
+
|
16
|
+
## Installation
|
17
|
+
|
18
|
+
BookingSync Portal works with Rails 4.0 onwards and Ruby 2.0 onwards. To get started, add it to your Gemfile with:
|
19
|
+
|
20
|
+
```ruby
|
21
|
+
gem 'bookingsync_portal'
|
22
|
+
```
|
23
|
+
|
24
|
+
Then bundle install:
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
bundle install
|
28
|
+
```
|
29
|
+
|
30
|
+
### Add routes
|
31
|
+
|
32
|
+
BookingSync Authorization routes need to be mounted inside you apps `routes.rb`:
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
mount BookingSync::Engine => '/'
|
36
|
+
```
|
37
|
+
|
38
|
+
This will add the following routes:
|
39
|
+
|
40
|
+
* `/auth/bookingsync/callback`
|
41
|
+
* `/auth/failure`
|
42
|
+
* `/signout`
|
43
|
+
|
44
|
+
as well as BookingSync Portal controllers routes:
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
mount BookingsyncPortal::Engine => '/'
|
48
|
+
```
|
49
|
+
|
50
|
+
### Migrations
|
51
|
+
|
52
|
+
BookingSync Portal provide migrations for the most common models:
|
53
|
+
* `Account`: BookingSync accounts,
|
54
|
+
* `Connection`: connection between `rentals` and `remote_rentals`,
|
55
|
+
* `Photo`: BookingSync rentals' photos,
|
56
|
+
* `Rate`: BookingSync rentals' rates,
|
57
|
+
* `RemoteAccount`: Portal accounts,
|
58
|
+
* `RemoteRental`: Portal rentals,
|
59
|
+
* `Rental`: BookingSync rentals,
|
60
|
+
|
61
|
+
You can copy the migrations file to your application by running:
|
62
|
+
|
63
|
+
```console
|
64
|
+
rake bookingsync_portal:install:migrations
|
65
|
+
```
|
66
|
+
|
67
|
+
then run the migration:
|
68
|
+
|
69
|
+
```console
|
70
|
+
rake db:migrate
|
71
|
+
```
|
4
72
|
|
5
|
-
|
73
|
+
### Add initializer and default models
|
74
|
+
|
75
|
+
This will install a configuration file in `config/initializers/bookingsync_portal.rb` as well as creating default models:
|
76
|
+
|
77
|
+
```console
|
78
|
+
rails g bookingsync_portal:install
|
79
|
+
```
|
80
|
+
|
81
|
+
|
82
|
+
### Assets
|
6
83
|
|
7
84
|
You will need to install the assets for each namespace:
|
8
85
|
|
@@ -45,3 +122,47 @@ in `/app/assets/javascripts/admin/application.css.scss`:
|
|
45
122
|
*/
|
46
123
|
|
47
124
|
```
|
125
|
+
|
126
|
+
|
127
|
+
_Note: When saving new token, this gem uses a separate thread with new db connection to ensure token save (in case of a rollback in the main transaction). To make room for the new connections, it is recommended to increase db `pool` size by 2-3._
|
128
|
+
|
129
|
+
## Configuration
|
130
|
+
|
131
|
+
The engine is configured by the following ENV variables:
|
132
|
+
|
133
|
+
* `BOOKINGSYNC_URL` - the url of the website, should be `https://www.bookingsync.com`
|
134
|
+
* `BOOKINGSYNC_APP_ID` - BookingSync Application's Client ID
|
135
|
+
* `BOOKINGSYNC_APP_SECRET` - BookingSync Application's Client Secret
|
136
|
+
* `BOOKINGSYNC_VERIFY_SSL` - Verify SSL (available only in development or test). Default to false
|
137
|
+
* `BOOKINGSYNC_SCOPE` - Space separated list of required scopes. Defaults to nil, which means the public scope.
|
138
|
+
|
139
|
+
You might want to use [dotenv-rails](https://github.com/bkeepers/dotenv)
|
140
|
+
to make ENV variables management easy.
|
141
|
+
|
142
|
+
## Testing
|
143
|
+
|
144
|
+
### RSpec
|
145
|
+
|
146
|
+
We do provide some helper for RSpec users, you can include them in your `spec/rails_helper.rb` (before `spec/support` inclusion):
|
147
|
+
```
|
148
|
+
require 'bookingsync_application/spec_helper'
|
149
|
+
```
|
150
|
+
|
151
|
+
### VCR
|
152
|
+
|
153
|
+
We recommend a VCR setup inspired from the following configuration. It will mask authorization tokens from your fixtures:
|
154
|
+
|
155
|
+
```ruby
|
156
|
+
require 'vcr'
|
157
|
+
|
158
|
+
VCR.configure do |config|
|
159
|
+
config.cassette_library_dir = 'spec/fixtures/cassettes'
|
160
|
+
config.hook_into :webmock
|
161
|
+
config.configure_rspec_metadata!
|
162
|
+
config.filter_sensitive_data('BOOKINGSYNC_OAUTH_ACCESS_TOKEN') do
|
163
|
+
ENV['BOOKINGSYNC_OAUTH_ACCESS_TOKEN']
|
164
|
+
end
|
165
|
+
# Uncomment if using codeclimate
|
166
|
+
# config.ignore_hosts 'codeclimate.com'
|
167
|
+
end
|
168
|
+
```
|
@@ -7,4 +7,9 @@ class BookingsyncPortal::Account < ActiveRecord::Base
|
|
7
7
|
has_many :remote_rentals, class_name: BookingsyncPortal.remote_rental_model, through: :remote_accounts
|
8
8
|
has_many :rentals, class_name: BookingsyncPortal.rental_model, dependent: :destroy
|
9
9
|
has_many :connections, class_name: BookingsyncPortal.connection_model, through: :rentals
|
10
|
+
|
11
|
+
# Used to synchronize accounts using `Account.synchronize(remove: true)`
|
12
|
+
def self.api
|
13
|
+
BookingSync::API::Client.new(BookingSync::Engine.application_token.token)
|
14
|
+
end
|
10
15
|
end
|
@@ -2,8 +2,10 @@ class BookingsyncPortal::Rental < ActiveRecord::Base
|
|
2
2
|
self.table_name = 'rentals'
|
3
3
|
|
4
4
|
belongs_to :account, class_name: BookingsyncPortal.account_model
|
5
|
-
has_one
|
6
|
-
has_one
|
5
|
+
has_one :connection, class_name: BookingsyncPortal.connection_model, dependent: :destroy
|
6
|
+
has_one :remote_rental, class_name: BookingsyncPortal.remote_rental_model, through: :connection
|
7
|
+
has_many :photos, class_name: BookingsyncPortal.photo_model, dependent: :destroy
|
8
|
+
has_many :rates, class_name: BookingsyncPortal.rate_model, dependent: :destroy
|
7
9
|
|
8
10
|
validates :synced_id, uniqueness: true, presence: true
|
9
11
|
|
@@ -15,4 +17,8 @@ class BookingsyncPortal::Rental < ActiveRecord::Base
|
|
15
17
|
def connected?
|
16
18
|
remote_rental.present?
|
17
19
|
end
|
20
|
+
|
21
|
+
def ordered_photos
|
22
|
+
photos.ordered
|
23
|
+
end
|
18
24
|
end
|
@@ -3,7 +3,7 @@ module BookingsyncPortal
|
|
3
3
|
class ConnectionResource < JSONAPI::Resource
|
4
4
|
model_name BookingsyncPortal.connection_model
|
5
5
|
|
6
|
-
attributes :
|
6
|
+
attributes :rental_id, :remote_rental_id
|
7
7
|
|
8
8
|
def self.records(options = {})
|
9
9
|
context = options[:context]
|
@@ -2,7 +2,7 @@
|
|
2
2
|
data-uid="<%= remote_rental.uid %>">
|
3
3
|
<div class="panel-heading" title="<%= RemoteRental.human_attribute_name(:uid) %>
|
4
4
|
<%= remote_rental.uid %>">
|
5
|
-
<%= remote_rental.remote_account.uid%>:
|
5
|
+
<%= remote_rental.remote_account.uid %>:
|
6
6
|
<%= remote_rental.name %>
|
7
7
|
</div>
|
8
8
|
<div class="panel-body">
|
@@ -6,7 +6,7 @@
|
|
6
6
|
<div class="rentals-list-scroll">
|
7
7
|
<%- if @visible_rentals_count == 0 -%>
|
8
8
|
<div class="lead text-center well">
|
9
|
-
<p><%= t('.no_published_rentals_html', id: current_account.
|
9
|
+
<p><%= t('.no_published_rentals_html', id: current_account.synced_id) %></p>
|
10
10
|
</div>
|
11
11
|
<%- elsif @not_connected_rentals.count > 0 -%>
|
12
12
|
<% @not_connected_rentals.each do |rental| %>
|
data/config/locales/en.yml
CHANGED
@@ -2,12 +2,16 @@ class CreateAccounts < ActiveRecord::Migration
|
|
2
2
|
def change
|
3
3
|
create_table :accounts do |t|
|
4
4
|
t.string :provider
|
5
|
-
t.integer :
|
5
|
+
t.integer :synced_id, index: true
|
6
6
|
t.string :name
|
7
7
|
t.string :oauth_access_token
|
8
8
|
t.string :oauth_refresh_token
|
9
9
|
t.datetime :oauth_expires_at
|
10
|
-
t.
|
10
|
+
t.text :synced_data
|
11
|
+
t.datetime :synced_all_at
|
12
|
+
t.string :email
|
13
|
+
|
14
|
+
t.timestamps null: false
|
11
15
|
end
|
12
16
|
end
|
13
17
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class CreatePhotos < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :photos do |t|
|
4
|
+
t.belongs_to :rental, index: true
|
5
|
+
t.integer :synced_id, index: true
|
6
|
+
t.text :synced_data
|
7
|
+
t.datetime :synced_all_at
|
8
|
+
t.integer :position
|
9
|
+
|
10
|
+
t.timestamps null: false
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class CreateRates < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :rates do |t|
|
4
|
+
t.belongs_to :rental, index: true
|
5
|
+
t.integer :synced_id, index: true
|
6
|
+
t.text :synced_data
|
7
|
+
t.datetime :synced_all_at
|
8
|
+
|
9
|
+
t.timestamps null: false
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/lib/bookingsync_portal.rb
CHANGED
@@ -34,10 +34,18 @@ module BookingsyncPortal
|
|
34
34
|
mattr_accessor :remote_rental_model
|
35
35
|
@@remote_rental_model = 'BookingsyncPortal::RemoteRental'
|
36
36
|
|
37
|
-
#
|
37
|
+
# connection model class
|
38
38
|
mattr_accessor :connection_model
|
39
39
|
@@connection_model = 'BookingsyncPortal::Connection'
|
40
40
|
|
41
|
+
# photo model class
|
42
|
+
mattr_accessor :photo_model
|
43
|
+
@@photo_model = 'BookingsyncPortal::Photo'
|
44
|
+
|
45
|
+
# rate model class
|
46
|
+
mattr_accessor :rate_model
|
47
|
+
@@rate_model = 'BookingsyncPortal::Rate'
|
48
|
+
|
41
49
|
# account resource class
|
42
50
|
mattr_accessor :account_resource
|
43
51
|
@@account_resource = 'BookingsyncPortal::AdminApi::AccountResource'
|
@@ -5,11 +5,18 @@ module BookingsyncPortal
|
|
5
5
|
class InstallGenerator < ::Rails::Generators::Base
|
6
6
|
source_root File.expand_path("../../templates", __FILE__)
|
7
7
|
|
8
|
-
desc "Creates a BookingsyncPortal initializer."
|
8
|
+
desc "Creates a BookingsyncPortal initializer and default models."
|
9
9
|
|
10
10
|
def copy_initializer
|
11
|
-
template "bookingsync_portal.rb", "config/initializers/bookingsync_portal.rb"
|
11
|
+
template "initializers/bookingsync_portal.rb", "config/initializers/bookingsync_portal.rb"
|
12
|
+
template "models/account.rb", "app/models/account.rb"
|
13
|
+
template "models/connection.rb", "app/models/connection.rb"
|
14
|
+
template "models/photo.rb", "app/models/photo.rb"
|
15
|
+
template "models/rate.rb", "app/models/rate.rb"
|
16
|
+
template "models/remote_account.rb", "app/models/remote_account.rb"
|
17
|
+
template "models/remote_rental.rb", "app/models/remote_rental.rb"
|
18
|
+
template "models/rental.rb", "app/models/rental.rb"
|
12
19
|
end
|
13
20
|
end
|
14
21
|
end
|
15
|
-
end
|
22
|
+
end
|
@@ -1,19 +1,25 @@
|
|
1
1
|
# Use this to customize the behaviour of BookingsyncPortal engine and hook up custom synchronization
|
2
2
|
BookingsyncPortal.setup do |config|
|
3
3
|
# customize account model class, can extend BookingsyncPortal::Account
|
4
|
-
|
4
|
+
config.account_model = '::Account'
|
5
5
|
|
6
6
|
# customize remote account model class, can extend BookingsyncPortal::RemoteAccount
|
7
|
-
|
7
|
+
config.remote_account_model = '::RemoteAccount'
|
8
8
|
|
9
9
|
# customize rental model class, can extend BookingsyncPortal::Rental
|
10
|
-
|
10
|
+
config.rental_model = '::Rental'
|
11
11
|
|
12
12
|
# customize remote_rental model class, can extend BookingsyncPortal::RemoteRental
|
13
|
-
|
13
|
+
config.remote_rental_model = '::RemoteRental'
|
14
14
|
|
15
15
|
# customize connection model class, can extend BookingsyncPortal::Connection
|
16
|
-
|
16
|
+
config.connection_model = '::Connection'
|
17
|
+
|
18
|
+
# customize photo model class, can extend BookingsyncPortal::Photo
|
19
|
+
config.photo_model = '::Photo'
|
20
|
+
|
21
|
+
# customize rate model class, can extend BookingsyncPortal::Rate
|
22
|
+
config.rate_model = '::Rate'
|
17
23
|
|
18
24
|
# customize account resource class, can extend BookingsyncPortal::AdminApi::AccountResource
|
19
25
|
# config.account_resource = '::AdminApi::AccountResource'
|
@@ -43,4 +49,3 @@ BookingsyncPortal.setup do |config|
|
|
43
49
|
# return false if remote account is not present or not valid
|
44
50
|
end
|
45
51
|
end
|
46
|
-
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class Account < BookingsyncPortal::Account
|
2
|
+
synced local_attributes: [:email]
|
3
|
+
|
4
|
+
# Uncomment to add Rails logger
|
5
|
+
# def api
|
6
|
+
# @api ||= BookingSync::Engine::APIClient.new(token.token, logger: Rails.logger, account: self)
|
7
|
+
# end
|
8
|
+
|
9
|
+
# Uncomment to add Rails logger
|
10
|
+
# # Used to synchronize accounts using `Account.synchronize(remove: true)`
|
11
|
+
# def self.api
|
12
|
+
# BookingSync::API::Client.new(BookingSync::Engine.application_token.token, logger: Rails.logger)
|
13
|
+
# end
|
14
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bookingsync_portal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Marciniak
|
8
|
+
- Sebastien Grosjean
|
9
|
+
- Artur Krzeminski Freda
|
8
10
|
autorequire:
|
9
11
|
bindir: bin
|
10
12
|
cert_chain: []
|
11
|
-
date: 2015-
|
13
|
+
date: 2015-07-31 00:00:00.000000000 Z
|
12
14
|
dependencies:
|
13
15
|
- !ruby/object:Gem::Dependency
|
14
16
|
name: rails
|
@@ -44,14 +46,14 @@ dependencies:
|
|
44
46
|
requirements:
|
45
47
|
- - "~>"
|
46
48
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.
|
49
|
+
version: 0.3.1
|
48
50
|
type: :runtime
|
49
51
|
prerelease: false
|
50
52
|
version_requirements: !ruby/object:Gem::Requirement
|
51
53
|
requirements:
|
52
54
|
- - "~>"
|
53
55
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.
|
56
|
+
version: 0.3.1
|
55
57
|
- !ruby/object:Gem::Dependency
|
56
58
|
name: jquery-rails
|
57
59
|
requirement: !ruby/object:Gem::Requirement
|
@@ -304,9 +306,11 @@ dependencies:
|
|
304
306
|
- - ">="
|
305
307
|
- !ruby/object:Gem::Version
|
306
308
|
version: '0'
|
307
|
-
description:
|
309
|
+
description: A common base for creating BookingSync portal applications.
|
308
310
|
email:
|
309
311
|
- mandaryyyn@gmail.com
|
312
|
+
- dev@bookingsync.com
|
313
|
+
- artur@bookingsync.com
|
310
314
|
executables: []
|
311
315
|
extensions: []
|
312
316
|
extra_rdoc_files: []
|
@@ -333,6 +337,8 @@ files:
|
|
333
337
|
- app/helpers/bookingsync_portal/admin/rentals_helper.rb
|
334
338
|
- app/models/bookingsync_portal/account.rb
|
335
339
|
- app/models/bookingsync_portal/connection.rb
|
340
|
+
- app/models/bookingsync_portal/photo.rb
|
341
|
+
- app/models/bookingsync_portal/rate.rb
|
336
342
|
- app/models/bookingsync_portal/remote_account.rb
|
337
343
|
- app/models/bookingsync_portal/remote_rental.rb
|
338
344
|
- app/models/bookingsync_portal/rental.rb
|
@@ -358,12 +364,21 @@ files:
|
|
358
364
|
- db/migrate/20150222173711_create_remote_accounts.rb
|
359
365
|
- db/migrate/20150222174023_create_remote_rentals.rb
|
360
366
|
- db/migrate/20150222174234_create_connections.rb
|
367
|
+
- db/migrate/20150520134912_create_photos.rb
|
368
|
+
- db/migrate/20150521091056_create_rates.rb
|
361
369
|
- lib/bookingsync_portal.rb
|
362
370
|
- lib/bookingsync_portal/engine.rb
|
363
371
|
- lib/bookingsync_portal/mash_serializer.rb
|
364
372
|
- lib/bookingsync_portal/version.rb
|
365
373
|
- lib/generators/bookingsync_portal/install_generator.rb
|
366
|
-
- lib/generators/templates/bookingsync_portal.rb
|
374
|
+
- lib/generators/templates/initializers/bookingsync_portal.rb
|
375
|
+
- lib/generators/templates/models/account.rb
|
376
|
+
- lib/generators/templates/models/connection.rb
|
377
|
+
- lib/generators/templates/models/photo.rb
|
378
|
+
- lib/generators/templates/models/rate.rb
|
379
|
+
- lib/generators/templates/models/remote_account.rb
|
380
|
+
- lib/generators/templates/models/remote_rental.rb
|
381
|
+
- lib/generators/templates/models/rental.rb
|
367
382
|
- lib/tasks/bookingsync_portal_tasks.rake
|
368
383
|
homepage: https://github.com/BookingSync/bookingsync_portal
|
369
384
|
licenses:
|
@@ -385,8 +400,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
385
400
|
version: '0'
|
386
401
|
requirements: []
|
387
402
|
rubyforge_project:
|
388
|
-
rubygems_version: 2.4.
|
403
|
+
rubygems_version: 2.4.8
|
389
404
|
signing_key:
|
390
405
|
specification_version: 4
|
391
406
|
summary: A common base for creating BookingSync portal applications.
|
392
407
|
test_files: []
|
408
|
+
has_rdoc:
|