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.
Files changed (100) hide show
  1. data/CHANGELOG.textile +3 -0
  2. data/LICENSE +1 -1
  3. data/README.textile +23 -0
  4. data/Rakefile +69 -19
  5. data/TODO.textile +5 -0
  6. data/VERSION.yml +1 -1
  7. data/app/controllers/eventable/categories_controller.rb +58 -0
  8. data/app/controllers/eventable/categorylists_controller.rb +29 -0
  9. data/app/controllers/eventable/eventable_controller.rb +45 -0
  10. data/app/controllers/eventable/events_controller.rb +54 -0
  11. data/app/controllers/eventable/opening_periodlists_controller.rb +40 -0
  12. data/app/controllers/eventable/opening_periods_controller.rb +78 -0
  13. data/app/controllers/eventable/opening_timelists_controller.rb +45 -0
  14. data/app/controllers/eventable/opening_times_controller.rb +81 -0
  15. data/app/controllers/eventable/pricelists_controller.rb +40 -0
  16. data/app/controllers/eventable/prices_controller.rb +76 -0
  17. data/app/models/eventable/categorization.rb +9 -0
  18. data/app/models/eventable/category.rb +10 -0
  19. data/app/models/eventable/categorylist.rb +49 -0
  20. data/app/models/eventable/opening_period.rb +21 -0
  21. data/app/models/eventable/opening_periodlist.rb +30 -0
  22. data/app/models/eventable/opening_time.rb +42 -0
  23. data/app/models/eventable/opening_timelist.rb +30 -0
  24. data/app/models/eventable/price.rb +15 -0
  25. data/app/models/eventable/pricelist.rb +30 -0
  26. data/app/models/eventable/program_item.rb +11 -0
  27. data/app/models/eventable/review.rb +7 -0
  28. data/app/views/eventable/categories/_form.html.erb +14 -0
  29. data/app/views/eventable/categories/edit.html.erb +13 -0
  30. data/app/views/eventable/categories/index.html.erb +22 -0
  31. data/app/views/eventable/categories/new.html.erb +12 -0
  32. data/app/views/eventable/categories/show.html.erb +17 -0
  33. data/app/views/eventable/categorylists/edit.html.erb +20 -0
  34. data/app/views/eventable/categorylists/show.html.erb +18 -0
  35. data/app/views/eventable/events/edit.html.erb +12 -0
  36. data/app/views/eventable/events/index.html.erb +20 -0
  37. data/app/views/eventable/events/new.html.erb +11 -0
  38. data/app/views/eventable/events/show.html.erb +12 -0
  39. data/app/views/eventable/opening_periodlists/edit.html.erb +16 -0
  40. data/app/views/eventable/opening_periodlists/show.html.erb +28 -0
  41. data/app/views/eventable/opening_periods/_form.html.erb +9 -0
  42. data/app/views/eventable/opening_periods/edit.html.erb +13 -0
  43. data/app/views/eventable/opening_periods/index.html.erb +22 -0
  44. data/app/views/eventable/opening_periods/new.html.erb +12 -0
  45. data/app/views/eventable/opening_periods/show.html.erb +13 -0
  46. data/app/views/eventable/opening_timelists/edit.html.erb +16 -0
  47. data/app/views/eventable/opening_timelists/show.html.erb +30 -0
  48. data/app/views/eventable/opening_times/_form.html.erb +14 -0
  49. data/app/views/eventable/opening_times/edit.html.erb +13 -0
  50. data/app/views/eventable/opening_times/index.html.erb +24 -0
  51. data/app/views/eventable/opening_times/new.html.erb +12 -0
  52. data/app/views/eventable/opening_times/show.html.erb +18 -0
  53. data/app/views/eventable/pricelists/edit.html.erb +16 -0
  54. data/app/views/eventable/pricelists/show.html.erb +28 -0
  55. data/app/views/eventable/prices/_form.html.erb +9 -0
  56. data/app/views/eventable/prices/edit.html.erb +13 -0
  57. data/app/views/eventable/prices/index.html.erb +22 -0
  58. data/app/views/eventable/prices/new.html.erb +12 -0
  59. data/app/views/eventable/prices/show.html.erb +13 -0
  60. data/config/routes.rb +25 -0
  61. data/generators/eventable/USAGE +1 -0
  62. data/generators/eventable/eventable_generator.rb +26 -0
  63. data/generators/eventable/templates/README +1 -0
  64. data/generators/eventable/templates/factories.rb +12 -0
  65. data/generators/eventable/templates/migrations/eventable.rb +134 -0
  66. data/lib/eventable.rb +27 -0
  67. data/lib/eventable/acts_as_event.rb +10 -0
  68. data/lib/eventable/model.rb +58 -0
  69. data/rails/init.rb +1 -0
  70. data/shoulda_macros/eventable.rb +16 -0
  71. data/test/rails_root/app/controllers/application_controller.rb +10 -0
  72. data/test/rails_root/app/controllers/events_controller.rb +85 -0
  73. data/test/rails_root/app/helpers/application_helper.rb +3 -0
  74. data/test/rails_root/app/helpers/events_helper.rb +2 -0
  75. data/test/rails_root/app/models/event.rb +3 -0
  76. data/test/rails_root/app/models/user.rb +2 -0
  77. data/test/rails_root/config/boot.rb +110 -0
  78. data/test/rails_root/config/environment.rb +41 -0
  79. data/test/rails_root/config/environments/development.rb +17 -0
  80. data/test/rails_root/config/environments/production.rb +28 -0
  81. data/test/rails_root/config/environments/test.rb +28 -0
  82. data/test/rails_root/config/initializers/backtrace_silencers.rb +7 -0
  83. data/test/rails_root/config/initializers/inflections.rb +10 -0
  84. data/test/rails_root/config/initializers/mime_types.rb +5 -0
  85. data/test/rails_root/config/initializers/new_rails_defaults.rb +19 -0
  86. data/test/rails_root/config/initializers/session_store.rb +15 -0
  87. data/test/rails_root/config/locales/en.rb +19 -0
  88. data/test/rails_root/config/locales/nl.rb +30 -0
  89. data/test/rails_root/config/routes.rb +3 -0
  90. data/test/rails_root/db/migrate/20090504165857_create_events.rb +13 -0
  91. data/test/rails_root/db/migrate/20090512075657_setup_eventable_0_0_0.rb +60 -0
  92. data/test/rails_root/db/schema.rb +71 -0
  93. data/test/rails_root/test/factories/eventable.rb +12 -0
  94. data/test/rails_root/test/functional/events_controller_test.rb +4 -0
  95. data/test/rails_root/test/unit/event_test.rb +8 -0
  96. data/test/rails_root/test/unit/helpers/events_helper_test.rb +4 -0
  97. data/test/test_helper.rb +23 -6
  98. metadata +134 -10
  99. data/README.rdoc +0 -7
  100. data/test/eventable_test.rb +0 -7
@@ -0,0 +1,13 @@
1
+ <h1>Editing opening time</h1>
2
+
3
+ <% form_for(@opening_time, :url => eventable_opening_period_opening_time_path(@opening_period, @opening_time)) do |f| %>
4
+ <%= f.error_messages %>
5
+
6
+ <%= render :partial => 'eventable/opening_times/form', :object => f %>
7
+ <p>
8
+ <%= f.submit 'Update' %>
9
+ </p>
10
+ <% end %>
11
+
12
+ <%= link_to 'Show', eventable_opening_period_opening_time_path(@opening_period, @opening_time) %>
13
+ <%= link_to 'Back', eventable_opening_period_opening_times_path(@opening_period) %>
@@ -0,0 +1,24 @@
1
+ <h1>Listing opening times</h1>
2
+
3
+ <table>
4
+ <tr>
5
+ <th>Day of week</th>
6
+ <th>Open</th>
7
+ <th>Closed</th>
8
+ </tr>
9
+
10
+ <% @opening_times.each do |opening_time| %>
11
+ <tr>
12
+ <td><%= t('date.day_names')[opening_time.day_of_week] %></td>
13
+ <td><%= opening_time.open_at %></td>
14
+ <td><%= opening_time.closed_at %></td>
15
+ <td><%= link_to 'Show', eventable_opening_period_opening_time_path(@opening_period, opening_time) %></td>
16
+ <td><%= link_to 'Edit', edit_eventable_opening_period_opening_time_path(@opening_period, opening_time) %></td>
17
+ <td><%= button_to 'Destroy', eventable_opening_period_opening_time_path(@opening_period, opening_time), :confirm => 'Are you sure?', :method => :delete %></td>
18
+ </tr>
19
+ <% end %>
20
+ </table>
21
+
22
+ <br />
23
+
24
+ <%= link_to 'New opening time', new_eventable_opening_period_opening_time_path(@opening_period) %>
@@ -0,0 +1,12 @@
1
+ <h1>New opening time</h1>
2
+
3
+ <% form_for(@opening_time, :url => eventable_opening_period_opening_times_path(@opening_period)) do |f| %>
4
+ <%= f.error_messages %>
5
+
6
+ <%= render :partial => 'eventable/opening_times/form', :object => f %>
7
+ <p>
8
+ <%= f.submit 'Create' %>
9
+ </p>
10
+ <% end %>
11
+
12
+ <%= link_to 'Back', eventable_opening_period_opening_times_path(@opening_period) %>
@@ -0,0 +1,18 @@
1
+ <p>
2
+ <b>Day of week:</b>
3
+ <%= t('date.day_names')[@opening_time.day_of_week] %>
4
+ </p>
5
+
6
+ <p>
7
+ <b>Open:</b>
8
+ <%= @opening_time.open_at %>
9
+ </p>
10
+
11
+ <p>
12
+ <b>Closed:</b>
13
+ <%= @opening_time.closed_at %>
14
+ </p>
15
+
16
+ <%= link_to 'Edit', edit_eventable_opening_period_opening_time_path(@opening_period, @opening_time) %> |
17
+ <%= link_to 'Back', eventable_opening_period_opening_times_path(@opening_period) %>
18
+
@@ -0,0 +1,16 @@
1
+ <h1>Edit Pricelist</h1>
2
+
3
+ <% form_for(@pricelist, :url => eventable_event_pricelist_path(@event)) do |f| %>
4
+ <%= f.error_messages %>
5
+ <% f.fields_for :items do |pf| %>
6
+ <%= render :partial => 'eventable/prices/form', :object => pf %>
7
+ <% unless pf.object.new_record? %>
8
+ <%= pf.label :_delete, 'remove' %>
9
+ <%= pf.check_box :_delete %>
10
+ <% end %>
11
+ <% end %>
12
+ <p>
13
+ <%= f.submit 'Update' %>
14
+ </p>
15
+ <% end %>
16
+ <%= link_to 'Back', eventable_event_pricelist_path(@event) %>
@@ -0,0 +1,28 @@
1
+ <h1>Pricelist</h1>
2
+ <h3><%= link_to 'Edit', edit_eventable_event_pricelist_path(@event) %></h3>
3
+
4
+ <table>
5
+ <tr>
6
+ <th>Text</th>
7
+ <th>Price</th>
8
+ </tr>
9
+
10
+ <% @pricelist.items.each do |price| %>
11
+ <tr>
12
+ <td><%=h price.text %></td>
13
+ <td><%= number_to_currency(price.price) %></td>
14
+ <td><%= button_to 'Remove', eventable_event_price_path(@event, price, :list => true), :confirm => 'Are you sure?', :method => :delete %></td>
15
+ </tr>
16
+ <% end %>
17
+ </table>
18
+
19
+ <br/>
20
+ <strong>Add a new price:</strong>
21
+ <% form_for(@new_price, :url => eventable_event_prices_path(@event, :list => true)) do |f| %>
22
+ <%= f.error_messages %>
23
+
24
+ <%= render :partial => 'eventable/prices/form', :object => f %>
25
+ <p>
26
+ <%= f.submit 'Create' %>
27
+ </p>
28
+ <% end %>
@@ -0,0 +1,9 @@
1
+ <p>
2
+ <%= form.label :text %>
3
+ <%= form.text_field :text %>
4
+ </p>
5
+
6
+ <p>
7
+ <%= form.label :price %>
8
+ <%= form.text_field :price %>
9
+ </p>
@@ -0,0 +1,13 @@
1
+ <h1>Editing event</h1>
2
+
3
+ <% form_for(@price, :url => eventable_event_price_path(@event, @price)) do |f| %>
4
+ <%= f.error_messages %>
5
+
6
+ <%= render :partial => 'eventable/prices/form', :object => f %>
7
+ <p>
8
+ <%= f.submit 'Update' %>
9
+ </p>
10
+ <% end %>
11
+
12
+ <%= link_to 'Show', eventable_event_price_path(@event, @price) %>
13
+ <%= link_to 'Back', eventable_event_prices_path(@event) %>
@@ -0,0 +1,22 @@
1
+ <h1>Listing prices</h1>
2
+
3
+ <table>
4
+ <tr>
5
+ <th>Text</th>
6
+ <th>Price</th>
7
+ </tr>
8
+
9
+ <% @prices.each do |price| %>
10
+ <tr>
11
+ <td><%=h price.text %></td>
12
+ <td><%= number_to_currency(price.price) %></td>
13
+ <td><%= link_to 'Show', eventable_event_price_path(@event, price) %></td>
14
+ <td><%= link_to 'Edit', edit_eventable_event_price_path(@event, price) %></td>
15
+ <td><%= button_to 'Destroy', eventable_event_price_path(@event, price), :confirm => 'Are you sure?', :method => :delete %></td>
16
+ </tr>
17
+ <% end %>
18
+ </table>
19
+
20
+ <br />
21
+
22
+ <%= link_to 'New price', new_eventable_event_price_path(@event) %>
@@ -0,0 +1,12 @@
1
+ <h1>New price</h1>
2
+
3
+ <% form_for(@price, :url => eventable_event_prices_path(@event)) do |f| %>
4
+ <%= f.error_messages %>
5
+
6
+ <%= render :partial => 'eventable/prices/form', :object => f %>
7
+ <p>
8
+ <%= f.submit 'Create' %>
9
+ </p>
10
+ <% end %>
11
+
12
+ <%= link_to 'Back', eventable_event_prices_path(@event) %>
@@ -0,0 +1,13 @@
1
+ <p>
2
+ <b>Text:</b>
3
+ <%=h @price.text %>
4
+ </p>
5
+
6
+ <p>
7
+ <b>Price:</b>
8
+ <%= number_to_currency(@price.price) %>
9
+ </p>
10
+
11
+ <%= link_to 'Edit', edit_eventable_event_price_path(@event, @price) %> |
12
+ <%= link_to 'Back', eventable_event_prices_path(@event) %>
13
+
data/config/routes.rb ADDED
@@ -0,0 +1,25 @@
1
+ ActionController::Routing::Routes.draw do |map|
2
+ # namespace everything to not disturb normal site routes
3
+ map.namespace :eventable do |e|
4
+
5
+ e.resources :events do |event|
6
+ # route for editing/removing prices one by one (or ajax-y)
7
+ event.resources :prices
8
+
9
+ # the 'prices' resource of an event (the page that
10
+ # adds/edits/removes all prices)
11
+ event.resource :pricelist, :only => [:show, :edit, :update]
12
+
13
+ event.resources :opening_periods
14
+ event.resource :opening_periodlist, :only => [:show, :edit, :update]
15
+
16
+ event.resource :categorylist, :only => [:show, :edit, :update]
17
+ end
18
+
19
+ e.resources :opening_periods do |op|
20
+ op.resources :opening_times
21
+ op.resource :opening_timelist, :only => [:show, :edit, :update]
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1 @@
1
+ script/generate eventable
@@ -0,0 +1,26 @@
1
+ EVENTABLE_ROOT = File.join(File.dirname(__FILE__), '..', '..')
2
+ class EventableGenerator < Rails::Generator::Base
3
+
4
+ def manifest
5
+ record do |m|
6
+
7
+ m.directory File.join("test", "factories")
8
+ m.file "factories.rb", "test/factories/eventable.rb"
9
+
10
+ m.migration_template "migrations/eventable.rb",
11
+ 'db/migrate',
12
+ :migration_file_name => "setup_eventable_#{version.gsub('.', '_')}"
13
+
14
+ m.readme "README"
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def version
21
+ config = YAML.load(File.read(File.join(EVENTABLE_ROOT, 'VERSION.yml')))
22
+ "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
23
+ end
24
+
25
+ end
26
+
@@ -0,0 +1 @@
1
+ Please check the migration before running it!
@@ -0,0 +1,12 @@
1
+ Factory.sequence :name do |n|
2
+ "Event #{n}"
3
+ end
4
+
5
+ Factory.define :event do |event|
6
+ event.name { Factory.next :name }
7
+ event.description { "Just some testing event" }
8
+ end
9
+
10
+ Factory.define :special_event, :parent => :event do |event|
11
+ event.name { "special" }
12
+ end
@@ -0,0 +1,134 @@
1
+ <%
2
+ def version
3
+ config = YAML.load(File.read(File.join(EVENTABLE_ROOT, 'VERSION.yml')))
4
+ "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
5
+ end
6
+ -%>
7
+ class <%= "SetupEventable#{version.gsub('.','')}" -%> < ActiveRecord::Migration
8
+ <%
9
+ tables = {
10
+ :eventable_program_items => [
11
+ [:event_id, 't.belongs_to :event'],
12
+ [:user_id, 't.belongs_to :user'],
13
+ [:start_at, 't.datetime :start_at'],
14
+ [:end_at, 't.datetime :end_at']
15
+ ],
16
+ :eventable_reviews => [
17
+ [:program_item_id, 't.belongs_to :program_item'],
18
+ [:review, 't.float :review'],
19
+ [:text, 't.text :text']
20
+ ],
21
+ :eventable_prices => [
22
+ [:event_id, 't.belongs_to :event'],
23
+ [:text, 't.text :text'],
24
+ [:price, 't.decimal :price, :scale => 2, :precision => 6']
25
+ ],
26
+ :eventable_opening_periods => [
27
+ [:event_id, 't.belongs_to :event'],
28
+ [:start_at, 't.datetime :start_at'],
29
+ [:end_at, 't.datetime :end_at']
30
+ ],
31
+ :eventable_opening_times => [
32
+ [:period_id, 't.belongs_to :period'],
33
+ [:day_of_week, 't.integer :day_of_week'],
34
+ [:minutes_start, 't.integer :minutes_start'],
35
+ [:minutes_end, 't.integer :minutes_end'],
36
+ ],
37
+ :eventable_categories => [
38
+ [:name, 't.string :name'],
39
+ [:description, 't.text :description'],
40
+ [:group, 't.string :group'],
41
+ [:avatar_file_name, 't.string :avatar_file_name'],
42
+ [:avatar_file_size, 't.integer :avatar_file_size'],
43
+ [:avatar_content_type, 't.string :avatar_content_type']
44
+ ],
45
+ :eventable_categories_events => [
46
+ [:event_id, 't.belongs_to :event'],
47
+ [:category_id, 't.belongs_to :category']
48
+ ]
49
+ }
50
+ indexes = {
51
+ :eventable_program_items => [
52
+ :event_id,
53
+ :user_id
54
+ ],
55
+ :eventable_reviews => [
56
+ :program_item_id
57
+ ],
58
+ :eventable_prices => [
59
+ :event_id
60
+ ],
61
+ :eventable_opening_periods => [
62
+ :event_id,
63
+ [:start_at, :end_at]
64
+ ],
65
+ :eventable_opening_times => [
66
+ { :index => [:period_id, :day_of_week, :minutes_start, :minutes_end], :name => 'full_index' }
67
+ ],
68
+ :eventable_categories_events => [
69
+ :event_id,
70
+ :category_id
71
+ ],
72
+ }
73
+ -%>
74
+ def self.up
75
+ <% tables.keys.each do |table| -%>
76
+ <% cols = tables[table] -%>
77
+ <% if ActiveRecord::Base.connection.table_exists?(table) -%>
78
+ change_table(:<%= table -%>) do |t|
79
+ <% existing_columns = ActiveRecord::Base.connection.columns(table).map(&:name) -%>
80
+ <% cols.reject! { |c| existing_columns.include?(c.first.to_s) } -%>
81
+ <% else -%>
82
+ create_table(:<%= table -%>) do |t|
83
+ <% end -%>
84
+ <% cols.each do |c| -%>
85
+ <%= c.last %>
86
+ <% end -%>
87
+ end
88
+
89
+ <% end -%>
90
+ <% indexes.keys.each do |table| -%>
91
+ <% idxs = indexes[table] -%>
92
+ <% if ActiveRecord::Base.connection.table_exists?(table) -%>
93
+ <% existing_indexes = ActiveRecord::Base.connection.indexes(table).map{|c| c.columns.sort} -%>
94
+ <% idxs.reject! { |c| existing_indexes.include?([*c].map(&:to_s).sort) } -%>
95
+ <% end -%>
96
+ <% idxs.each do |i| -%>
97
+ <% if Hash === i -%>
98
+ add_index :<%= table %>, <%= i[:index].inspect %>, :name => <%= i[:name].inspect -%>
99
+ <% else -%>
100
+ add_index :<%= table %>, <%= i.inspect %>
101
+ <% end -%>
102
+ <% end -%>
103
+
104
+ <% end -%>
105
+ end
106
+
107
+ def self.down
108
+ <% indexes.keys.each do |table| -%>
109
+ <% idxs = indexes[table] -%>
110
+ <% idxs.each do |i| -%>
111
+ <% if Hash === i -%>
112
+ remove_index :<%= table %>, <%= i[:index].inspect %>, :name => <%= i[:name].inspect -%>
113
+ <% else -%>
114
+ remove_index :<%= table %>, <%= i.inspect %>
115
+ <% end -%>
116
+ <% end -%>
117
+
118
+ <% end -%>
119
+ <% tables.keys.each do |table| -%>
120
+ <% cols = tables[table] -%>
121
+ <% if ActiveRecord::Base.connection.table_exists?(table) -%>
122
+ change_table(:<%= table -%>) do |t|
123
+ <% cols.each do |c| -%>
124
+ t.remove :<%= c.first %>
125
+ <% end -%>
126
+ end
127
+ <% else -%>
128
+ drop_table :<%= table -%>
129
+ <% end -%>
130
+
131
+ <% end -%>
132
+ end
133
+
134
+ end
data/lib/eventable.rb CHANGED
@@ -0,0 +1,27 @@
1
+ # this version of eventable is meant to add event-like features to 1
2
+ # model, so we store it in one place
3
+ module Eventable
4
+
5
+ class << self
6
+ attr_accessor :model_name
7
+ end
8
+
9
+ #the model that's been made eventable by acts_as_event
10
+ def self.model
11
+ (
12
+ model_name ||
13
+ (detect_model_name if Rails.env.development?)
14
+ ).constantize
15
+ end
16
+
17
+ private
18
+
19
+ def self.detect_model_name
20
+ File.basename(
21
+ Dir.glob(File.join(Rails.root, 'app', 'models', '**', '*.rb')).
22
+ detect {|f| File.read(f).any? {|l| l[/acts_as_event/]}},
23
+ '.rb').classify rescue nil
24
+ end
25
+ end
26
+
27
+ require 'eventable/acts_as_event'
@@ -0,0 +1,10 @@
1
+ ActiveRecord::Base.instance_eval do
2
+ # The main method to declare a model to become event-like
3
+ # the following options are recognized:
4
+ #
5
+ # [user_class_name] class name for the User model as string - defaults to 'User'
6
+ def acts_as_event(*args)
7
+ include Eventable::Model
8
+ configure_eventable(*args)
9
+ end
10
+ end