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
|