dcs-eventable 0.0.0 → 0.0.8
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/CHANGELOG.textile +3 -0
- data/LICENSE +1 -1
- data/README.textile +23 -0
- data/Rakefile +69 -19
- data/TODO.textile +5 -0
- data/VERSION.yml +1 -1
- data/app/controllers/eventable/categories_controller.rb +58 -0
- data/app/controllers/eventable/categorylists_controller.rb +29 -0
- data/app/controllers/eventable/eventable_controller.rb +45 -0
- data/app/controllers/eventable/events_controller.rb +54 -0
- data/app/controllers/eventable/opening_periodlists_controller.rb +40 -0
- data/app/controllers/eventable/opening_periods_controller.rb +78 -0
- data/app/controllers/eventable/opening_timelists_controller.rb +45 -0
- data/app/controllers/eventable/opening_times_controller.rb +81 -0
- data/app/controllers/eventable/pricelists_controller.rb +40 -0
- data/app/controllers/eventable/prices_controller.rb +76 -0
- data/app/models/eventable/categorization.rb +9 -0
- data/app/models/eventable/category.rb +10 -0
- data/app/models/eventable/categorylist.rb +49 -0
- data/app/models/eventable/opening_period.rb +21 -0
- data/app/models/eventable/opening_periodlist.rb +30 -0
- data/app/models/eventable/opening_time.rb +42 -0
- data/app/models/eventable/opening_timelist.rb +30 -0
- data/app/models/eventable/price.rb +15 -0
- data/app/models/eventable/pricelist.rb +30 -0
- data/app/models/eventable/program_item.rb +11 -0
- data/app/models/eventable/review.rb +7 -0
- data/app/views/eventable/categories/_form.html.erb +14 -0
- data/app/views/eventable/categories/edit.html.erb +13 -0
- data/app/views/eventable/categories/index.html.erb +22 -0
- data/app/views/eventable/categories/new.html.erb +12 -0
- data/app/views/eventable/categories/show.html.erb +17 -0
- data/app/views/eventable/categorylists/edit.html.erb +20 -0
- data/app/views/eventable/categorylists/show.html.erb +18 -0
- data/app/views/eventable/events/edit.html.erb +12 -0
- data/app/views/eventable/events/index.html.erb +20 -0
- data/app/views/eventable/events/new.html.erb +11 -0
- data/app/views/eventable/events/show.html.erb +12 -0
- data/app/views/eventable/opening_periodlists/edit.html.erb +16 -0
- data/app/views/eventable/opening_periodlists/show.html.erb +28 -0
- data/app/views/eventable/opening_periods/_form.html.erb +9 -0
- data/app/views/eventable/opening_periods/edit.html.erb +13 -0
- data/app/views/eventable/opening_periods/index.html.erb +22 -0
- data/app/views/eventable/opening_periods/new.html.erb +12 -0
- data/app/views/eventable/opening_periods/show.html.erb +13 -0
- data/app/views/eventable/opening_timelists/edit.html.erb +16 -0
- data/app/views/eventable/opening_timelists/show.html.erb +30 -0
- data/app/views/eventable/opening_times/_form.html.erb +14 -0
- data/app/views/eventable/opening_times/edit.html.erb +13 -0
- data/app/views/eventable/opening_times/index.html.erb +24 -0
- data/app/views/eventable/opening_times/new.html.erb +12 -0
- data/app/views/eventable/opening_times/show.html.erb +18 -0
- data/app/views/eventable/pricelists/edit.html.erb +16 -0
- data/app/views/eventable/pricelists/show.html.erb +28 -0
- data/app/views/eventable/prices/_form.html.erb +9 -0
- data/app/views/eventable/prices/edit.html.erb +13 -0
- data/app/views/eventable/prices/index.html.erb +22 -0
- data/app/views/eventable/prices/new.html.erb +12 -0
- data/app/views/eventable/prices/show.html.erb +13 -0
- data/config/routes.rb +25 -0
- data/generators/eventable/USAGE +1 -0
- data/generators/eventable/eventable_generator.rb +26 -0
- data/generators/eventable/templates/README +1 -0
- data/generators/eventable/templates/factories.rb +12 -0
- data/generators/eventable/templates/migrations/eventable.rb +134 -0
- data/lib/eventable.rb +27 -0
- data/lib/eventable/acts_as_event.rb +10 -0
- data/lib/eventable/model.rb +58 -0
- data/rails/init.rb +1 -0
- data/shoulda_macros/eventable.rb +16 -0
- data/test/rails_root/app/controllers/application_controller.rb +10 -0
- data/test/rails_root/app/controllers/events_controller.rb +85 -0
- data/test/rails_root/app/helpers/application_helper.rb +3 -0
- data/test/rails_root/app/helpers/events_helper.rb +2 -0
- data/test/rails_root/app/models/event.rb +3 -0
- data/test/rails_root/app/models/user.rb +2 -0
- data/test/rails_root/config/boot.rb +110 -0
- data/test/rails_root/config/environment.rb +41 -0
- data/test/rails_root/config/environments/development.rb +17 -0
- data/test/rails_root/config/environments/production.rb +28 -0
- data/test/rails_root/config/environments/test.rb +28 -0
- data/test/rails_root/config/initializers/backtrace_silencers.rb +7 -0
- data/test/rails_root/config/initializers/inflections.rb +10 -0
- data/test/rails_root/config/initializers/mime_types.rb +5 -0
- data/test/rails_root/config/initializers/new_rails_defaults.rb +19 -0
- data/test/rails_root/config/initializers/session_store.rb +15 -0
- data/test/rails_root/config/locales/en.rb +19 -0
- data/test/rails_root/config/locales/nl.rb +30 -0
- data/test/rails_root/config/routes.rb +3 -0
- data/test/rails_root/db/migrate/20090504165857_create_events.rb +13 -0
- data/test/rails_root/db/migrate/20090512075657_setup_eventable_0_0_0.rb +60 -0
- data/test/rails_root/db/schema.rb +71 -0
- data/test/rails_root/test/factories/eventable.rb +12 -0
- data/test/rails_root/test/functional/events_controller_test.rb +4 -0
- data/test/rails_root/test/unit/event_test.rb +8 -0
- data/test/rails_root/test/unit/helpers/events_helper_test.rb +4 -0
- data/test/test_helper.rb +23 -6
- metadata +134 -10
- data/README.rdoc +0 -7
- data/test/eventable_test.rb +0 -7
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
class Eventable::OpeningTimelistsController < Eventable::EventableController
|
|
2
|
+
|
|
3
|
+
before_filter :get_opening_period
|
|
4
|
+
before_filter :get_event
|
|
5
|
+
before_filter :get_opening_timelist
|
|
6
|
+
|
|
7
|
+
def show
|
|
8
|
+
@new_opening_time = @opening_period.opening_times.build
|
|
9
|
+
try_after_callback
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def edit
|
|
13
|
+
# you can add a blank/new item like this:
|
|
14
|
+
# @opening_timelist.add_blank
|
|
15
|
+
try_after_callback
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def update
|
|
19
|
+
if @opening_timelist.update_attributes(params[:eventable_opening_timelist])
|
|
20
|
+
try_after_callback do
|
|
21
|
+
flash[:notice] = 'Opening times were successfully updated.'
|
|
22
|
+
redirect_to(eventable_opening_period_opening_timelist_path(@opening_period))
|
|
23
|
+
end
|
|
24
|
+
else
|
|
25
|
+
try_after_callback :fail do
|
|
26
|
+
render :action => "edit"
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
def get_opening_period
|
|
34
|
+
@opening_period = Eventable::OpeningPeriod.find(params[:opening_period_id])
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def get_event
|
|
38
|
+
@event = @opening_period.event
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def get_opening_timelist
|
|
42
|
+
@opening_timelist = @opening_period.opening_timelist
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
class Eventable::OpeningTimesController < Eventable::EventableController
|
|
2
|
+
|
|
3
|
+
before_filter :get_opening_period
|
|
4
|
+
before_filter :get_event
|
|
5
|
+
|
|
6
|
+
before_filter :get_opening_times, :only => [:index]
|
|
7
|
+
before_filter :get_opening_time, :only => [:show, :edit, :update, :destroy]
|
|
8
|
+
before_filter :new_opening_time, :only => [:new, :create]
|
|
9
|
+
|
|
10
|
+
def create
|
|
11
|
+
if @opening_time.update_attributes(params[:eventable_opening_time])
|
|
12
|
+
try_after_callback do
|
|
13
|
+
flash[:notice] = 'Opening time was successfully added.'
|
|
14
|
+
redirect_to (if params[:list]
|
|
15
|
+
eventable_opening_period_opening_timelist_path @opening_period
|
|
16
|
+
else
|
|
17
|
+
eventable_opening_period_opening_time_path @opening_period, @opening_time
|
|
18
|
+
end)
|
|
19
|
+
end
|
|
20
|
+
else
|
|
21
|
+
try_after_callback :fail do
|
|
22
|
+
render :action => "new"
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def update
|
|
28
|
+
if @opening_time.update_attributes(params[:eventable_opening_time])
|
|
29
|
+
try_after_callback do
|
|
30
|
+
flash[:notice] = 'Opening time was successfully updated.'
|
|
31
|
+
redirect_to (if params[:list]
|
|
32
|
+
eventable_opening_period_opening_timelist_path @opening_period
|
|
33
|
+
else
|
|
34
|
+
eventable_opening_period_opening_time_path @opening_period, @opening_time
|
|
35
|
+
end)
|
|
36
|
+
end
|
|
37
|
+
else
|
|
38
|
+
try_after_callback :fail do
|
|
39
|
+
render :action => "edit"
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def destroy
|
|
45
|
+
@opening_time.destroy
|
|
46
|
+
try_after_callback do
|
|
47
|
+
redirect_to (if params[:list]
|
|
48
|
+
eventable_opening_period_opening_timelist_path @opening_period
|
|
49
|
+
else
|
|
50
|
+
eventable_opening_period_opening_times_path @opening_period
|
|
51
|
+
end)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
private
|
|
56
|
+
|
|
57
|
+
def model
|
|
58
|
+
@opening_period.opening_times
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def get_opening_times
|
|
62
|
+
@opening_times = model.all
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def get_opening_time
|
|
66
|
+
@opening_time = model.find(params[:id])
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def new_opening_time
|
|
70
|
+
@opening_time = model.build
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def get_opening_period
|
|
74
|
+
@opening_period = Eventable::OpeningPeriod.find(params[:opening_period_id])
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def get_event
|
|
78
|
+
@event = @opening_period.event
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
class Eventable::PricelistsController < Eventable::EventableController
|
|
2
|
+
|
|
3
|
+
before_filter :get_event
|
|
4
|
+
before_filter :get_pricelist
|
|
5
|
+
|
|
6
|
+
def show
|
|
7
|
+
@new_price = @event.prices.build
|
|
8
|
+
try_after_callback
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def edit
|
|
12
|
+
# you can add a blank/new item like this:
|
|
13
|
+
@pricelist.add_blank
|
|
14
|
+
try_after_callback
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def update
|
|
18
|
+
if @pricelist.update_attributes(params[:eventable_pricelist])
|
|
19
|
+
try_after_callback do
|
|
20
|
+
flash[:notice] = 'Prices were successfully updated.'
|
|
21
|
+
redirect_to(eventable_event_pricelist_path(@event))
|
|
22
|
+
end
|
|
23
|
+
else
|
|
24
|
+
try_after_callback :fail do
|
|
25
|
+
render :action => "edit"
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
def get_event
|
|
33
|
+
@event = event_model.find(params[:event_id])
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def get_pricelist
|
|
37
|
+
@pricelist = @event.pricelist
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
class Eventable::PricesController < Eventable::EventableController
|
|
2
|
+
|
|
3
|
+
before_filter :get_event
|
|
4
|
+
|
|
5
|
+
before_filter :get_prices, :only => [:index]
|
|
6
|
+
before_filter :get_price, :only => [:show, :edit, :update, :destroy]
|
|
7
|
+
before_filter :new_price, :only => [:new, :create]
|
|
8
|
+
|
|
9
|
+
def create
|
|
10
|
+
if @price.update_attributes(params[:eventable_price])
|
|
11
|
+
try_after_callback do
|
|
12
|
+
flash[:notice] = 'Price was successfully added.'
|
|
13
|
+
redirect_to (if params[:list]
|
|
14
|
+
eventable_event_pricelist_path @event
|
|
15
|
+
else
|
|
16
|
+
eventable_event_price_path @event, @price
|
|
17
|
+
end)
|
|
18
|
+
end
|
|
19
|
+
else
|
|
20
|
+
try_after_callback :fail do
|
|
21
|
+
render :action => "new"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def update
|
|
27
|
+
if @price.update_attributes(params[:eventable_price])
|
|
28
|
+
try_after_callback do
|
|
29
|
+
flash[:notice] = 'Price was successfully updated.'
|
|
30
|
+
redirect_to (if params[:list]
|
|
31
|
+
eventable_event_pricelist_path @event
|
|
32
|
+
else
|
|
33
|
+
eventable_event_price_path @event, @price
|
|
34
|
+
end)
|
|
35
|
+
end
|
|
36
|
+
else
|
|
37
|
+
try_after_callback :fail do
|
|
38
|
+
render :action => "edit"
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def destroy
|
|
44
|
+
@price.destroy
|
|
45
|
+
try_after_callback do
|
|
46
|
+
redirect_to (if params[:list]
|
|
47
|
+
eventable_event_pricelist_path @event
|
|
48
|
+
else
|
|
49
|
+
eventable_event_prices_path @event
|
|
50
|
+
end)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
private
|
|
55
|
+
|
|
56
|
+
def model
|
|
57
|
+
@event.prices
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def get_prices
|
|
61
|
+
@prices = model.all
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def get_price
|
|
65
|
+
@price = model.find(params[:id])
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def new_price
|
|
69
|
+
@price = @event ? model.build : model.new
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def get_event
|
|
73
|
+
@event = event_model.find(params[:event_id])
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
class Eventable::Category < ActiveRecord::Base
|
|
2
|
+
unloadable
|
|
3
|
+
|
|
4
|
+
set_table_name 'eventable_categories'
|
|
5
|
+
attr_accessible :name, :description, :group, :avatar
|
|
6
|
+
|
|
7
|
+
has_many :categorizations, :class_name => 'Eventable::Categorization', :dependent => :destroy
|
|
8
|
+
has_many :events, :through => :categorizations
|
|
9
|
+
|
|
10
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
class Eventable::Categorylist
|
|
2
|
+
|
|
3
|
+
attr_reader :event, :items
|
|
4
|
+
delegate :id, :to => :event
|
|
5
|
+
|
|
6
|
+
class CategoryItem
|
|
7
|
+
attr_reader :id, :event, :name, :group
|
|
8
|
+
attr_accessor :active
|
|
9
|
+
|
|
10
|
+
def initialize(event, category)
|
|
11
|
+
@event = event
|
|
12
|
+
@name = category.name
|
|
13
|
+
@group = category.group
|
|
14
|
+
@id = category.id
|
|
15
|
+
@active = event.category_ids.include? @id
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def new_record?
|
|
19
|
+
true
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def initialize(event)
|
|
24
|
+
@event = event
|
|
25
|
+
@items = Eventable::Category.all.map { |c| CategoryItem.new(event, c)}
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def errors
|
|
29
|
+
ActiveRecord::Errors.new(self)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def items_attributes=(attr)
|
|
33
|
+
attr.values.each do |a|
|
|
34
|
+
@items.detect { |i| i.id == a[:id].to_i }.active = (a[:active] == '1')
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def update_attributes(attrs)
|
|
39
|
+
attrs.each do |k,v|
|
|
40
|
+
send "#{k}=", v
|
|
41
|
+
end
|
|
42
|
+
save
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def save
|
|
46
|
+
@event.category_ids = @items.select(&:active).map(&:id)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
class Eventable::OpeningPeriod < ActiveRecord::Base
|
|
2
|
+
set_table_name 'eventable_opening_periods'
|
|
3
|
+
|
|
4
|
+
unloadable
|
|
5
|
+
|
|
6
|
+
belongs_to :event, :class_name => 'Event', :foreign_key => :event_id
|
|
7
|
+
has_many :opening_times,
|
|
8
|
+
:class_name => 'Eventable::OpeningTime',
|
|
9
|
+
:foreign_key => 'period_id',
|
|
10
|
+
:dependent => :destroy
|
|
11
|
+
|
|
12
|
+
accepts_nested_attributes_for :opening_times, :allow_destroy => true,
|
|
13
|
+
:reject_if => proc { |attrs| attrs.all? { |k, v| v.blank? } }
|
|
14
|
+
|
|
15
|
+
attr_accessible :start_at, :end_at
|
|
16
|
+
|
|
17
|
+
def opening_timelist
|
|
18
|
+
Eventable::OpeningTimelist.new(self)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
class Eventable::OpeningPeriodlist
|
|
2
|
+
|
|
3
|
+
attr_reader :event, :items
|
|
4
|
+
delegate :id, :save, :to => :event
|
|
5
|
+
|
|
6
|
+
def initialize(event)
|
|
7
|
+
@event = event
|
|
8
|
+
@items = event.opening_periods.all
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def errors
|
|
12
|
+
ActiveRecord::Errors.new(self)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def add_blank
|
|
16
|
+
@items << @event.opening_periods.build
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def items_attributes=(attr)
|
|
20
|
+
@event.opening_periods_attributes=(attr)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def update_attributes(attrs)
|
|
24
|
+
attrs.each do |k,v|
|
|
25
|
+
send "#{k}=", v
|
|
26
|
+
end
|
|
27
|
+
save
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
class Eventable::OpeningTime < ActiveRecord::Base
|
|
2
|
+
set_table_name 'eventable_opening_times'
|
|
3
|
+
|
|
4
|
+
belongs_to :opening_period, :class_name => 'Eventable::OpeningPeriod', :foreign_key => 'period_id'
|
|
5
|
+
attr_accessible :day_of_week, :minutes_start, :minutes_end
|
|
6
|
+
|
|
7
|
+
validates_inclusion_of :day_of_week, :in => 0..6
|
|
8
|
+
validates_inclusion_of :minutes_start, :minutes_end, :in => 0..1440
|
|
9
|
+
|
|
10
|
+
def self.day_selector
|
|
11
|
+
(0..6).to_a.map {|n| [I18n.translate(:'date.day_names')[n],n]}
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.time_selector
|
|
15
|
+
(0..48).to_a.map do |n|
|
|
16
|
+
[to_time_string(n*30), n*30]
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def after_initialize
|
|
21
|
+
self.minutes_start ||= 540
|
|
22
|
+
self.minutes_end ||= 1080
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def open_at
|
|
26
|
+
to_time_string(minutes_start)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def closed_at
|
|
30
|
+
to_time_string(minutes_end)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
private
|
|
34
|
+
|
|
35
|
+
def self.to_time_string(m)
|
|
36
|
+
return nil if m.blank?
|
|
37
|
+
(Time.now.beginning_of_day + m.minutes).strftime "%H:%M"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
delegate :to_time_string, :to => 'self.class'
|
|
41
|
+
|
|
42
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
class Eventable::OpeningTimelist
|
|
2
|
+
|
|
3
|
+
attr_reader :opening_period, :items
|
|
4
|
+
delegate :id, :save, :to => :opening_period
|
|
5
|
+
|
|
6
|
+
def initialize(opening_period)
|
|
7
|
+
@opening_period = opening_period
|
|
8
|
+
@items = opening_period.opening_times.all
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def errors
|
|
12
|
+
ActiveRecord::Errors.new(self)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def add_blank
|
|
16
|
+
@items << @opening_period.opening_times.build
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def items_attributes=(attr)
|
|
20
|
+
@opening_period.opening_times_attributes=(attr)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def update_attributes(attrs)
|
|
24
|
+
attrs.each do |k,v|
|
|
25
|
+
send "#{k}=", v
|
|
26
|
+
end
|
|
27
|
+
save
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|