refinerycms-calendar 1.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.
- data/app/controllers/admin/event_categories_controller.rb +9 -0
- data/app/controllers/admin/events_controller.rb +26 -0
- data/app/controllers/event_categories_controller.rb +10 -0
- data/app/controllers/events_controller.rb +64 -0
- data/app/helpers/event_categories_helper.rb +3 -0
- data/app/helpers/events_helper.rb +38 -0
- data/app/models/event.rb +72 -0
- data/app/models/event_categorization.rb +4 -0
- data/app/models/event_category.rb +10 -0
- data/app/views/admin/event_categories/_event_categories.html.erb +1 -0
- data/app/views/admin/event_categories/_event_category.html.erb +18 -0
- data/app/views/admin/event_categories/_form.html.erb +26 -0
- data/app/views/admin/event_categories/_sortable_list.html.erb +3 -0
- data/app/views/admin/event_categories/edit.html.erb +1 -0
- data/app/views/admin/event_categories/index.html.erb +40 -0
- data/app/views/admin/event_categories/new.html.erb +1 -0
- data/app/views/admin/events/_event.html.erb +18 -0
- data/app/views/admin/events/_events.html.erb +1 -0
- data/app/views/admin/events/_form.html.erb +126 -0
- data/app/views/admin/events/_sortable_list.html.erb +20 -0
- data/app/views/admin/events/edit.html.erb +1 -0
- data/app/views/admin/events/index.html.erb +41 -0
- data/app/views/admin/events/new.html.erb +1 -0
- data/app/views/event_categories/show.html.erb +15 -0
- data/app/views/events/_event.html.erb +103 -0
- data/app/views/events/_sidebar.html.erb +38 -0
- data/app/views/events/archive.html.erb +17 -0
- data/app/views/events/index.html.erb +17 -0
- data/app/views/events/index.rss.builder +24 -0
- data/app/views/events/show.html.erb +15 -0
- data/changelog.md +22 -0
- data/config/locales/en.yml +39 -0
- data/config/locales/lolcat.yml +24 -0
- data/config/locales/nb.yml +20 -0
- data/config/locales/nl.yml +20 -0
- data/config/routes.rb +11 -0
- data/db/migrate/01_create_events.rb +33 -0
- data/db/migrate/02_create_event_categories.rb +13 -0
- data/db/migrate/03_create_event_categorizations.rb +17 -0
- data/db/seeds/events.rb +17 -0
- data/features/manage_events.feature +64 -0
- data/features/step_definitions/event_steps.rb +14 -0
- data/features/support/factories/event_categories.rb +3 -0
- data/features/support/factories/events.rb +6 -0
- data/features/support/paths.rb +17 -0
- data/lib/generators/refinerycms_events_generator.rb +6 -0
- data/lib/refinerycms-events.rb +23 -0
- data/lib/tasks/events.rake +13 -0
- data/public/stylesheets/refinerycms-events.css +73 -0
- data/readme.md +49 -0
- data/refinerycms-calendar.gemspec +17 -0
- data/spec/controllers/events_controller_spec.rb +14 -0
- data/spec/helpers/events_helper_spec.rb +16 -0
- data/spec/models/event_category_spec.rb +29 -0
- data/spec/models/event_spec.rb +82 -0
- metadata +133 -0
@@ -0,0 +1,33 @@
|
|
1
|
+
class CreateEvents < ActiveRecord::Migration
|
2
|
+
|
3
|
+
def self.up
|
4
|
+
create_table :events do |t|
|
5
|
+
t.string :title
|
6
|
+
t.datetime :start_at
|
7
|
+
t.datetime :end_at
|
8
|
+
t.string :venue_name
|
9
|
+
t.string :venue_address
|
10
|
+
t.decimal :ticket_price, :precision => 8, :scale => 2
|
11
|
+
t.string :ticket_link
|
12
|
+
t.text :description
|
13
|
+
t.boolean :featured
|
14
|
+
t.integer :image_id
|
15
|
+
t.integer :position
|
16
|
+
|
17
|
+
t.timestamps
|
18
|
+
end
|
19
|
+
|
20
|
+
add_index :events, :id
|
21
|
+
|
22
|
+
load(Rails.root.join('db', 'seeds', 'events.rb'))
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.down
|
26
|
+
UserPlugin.destroy_all({:name => "events"})
|
27
|
+
|
28
|
+
Page.delete_all({:link_url => "/events"})
|
29
|
+
|
30
|
+
drop_table :events
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class CreateEventCategorizations < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :event_categorizations do |t|
|
4
|
+
t.integer :event_id
|
5
|
+
t.integer :event_category_id
|
6
|
+
|
7
|
+
t.timestamps
|
8
|
+
end
|
9
|
+
|
10
|
+
add_index :event_categorizations, :event_id
|
11
|
+
add_index :event_categorizations, :event_category_id
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.down
|
15
|
+
drop_table :event_categorizations
|
16
|
+
end
|
17
|
+
end
|
data/db/seeds/events.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
User.find(:all).each do |user|
|
2
|
+
if user.plugins.find_by_name('events').nil?
|
3
|
+
user.plugins.create(:name => 'events',
|
4
|
+
:position => (user.plugins.maximum(:position) || -1) +1)
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
page = Page.create(
|
9
|
+
:title => 'Events',
|
10
|
+
:link_url => '/events',
|
11
|
+
:deletable => false,
|
12
|
+
:position => ((Page.maximum(:position, :conditions => {:parent_id => nil}) || -1)+1),
|
13
|
+
:menu_match => '^/events(\/|\/.+?|)$'
|
14
|
+
)
|
15
|
+
Page.default_parts.each_with_index do |default_page_part, idx|
|
16
|
+
page.parts.create(:title => default_page_part, :body => nil, :position => idx)
|
17
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
@events
|
2
|
+
Feature: Events
|
3
|
+
In order to have events on my website
|
4
|
+
As an administrator
|
5
|
+
I want to manage events
|
6
|
+
|
7
|
+
Background:
|
8
|
+
Given I am a logged in refinery user
|
9
|
+
And I have no events
|
10
|
+
|
11
|
+
@events-list @list
|
12
|
+
Scenario: Events List
|
13
|
+
Given I have events titled UniqueTitleOne, UniqueTitleTwo
|
14
|
+
When I go to the list of events
|
15
|
+
# And show me the page
|
16
|
+
Then I should see "UniqueTitleOne"
|
17
|
+
And I should see "UniqueTitleTwo"
|
18
|
+
|
19
|
+
@events-valid @valid
|
20
|
+
Scenario: Create Valid Event
|
21
|
+
When I go to the list of events
|
22
|
+
And I follow "Add New Event"
|
23
|
+
And I fill in "Title" with "This is a test of the first string field"
|
24
|
+
And I press "Save"
|
25
|
+
Then I should see "'This is a test of the first string field' was successfully added."
|
26
|
+
And I should have 1 event
|
27
|
+
|
28
|
+
@events-invalid @invalid
|
29
|
+
Scenario: Create Invalid Event (without title)
|
30
|
+
When I go to the list of events
|
31
|
+
And I follow "Add New Event"
|
32
|
+
And I press "Save"
|
33
|
+
Then I should see "Title can't be blank"
|
34
|
+
And I should have 0 events
|
35
|
+
|
36
|
+
@events-edit @edit
|
37
|
+
Scenario: Edit Existing Event
|
38
|
+
Given I have events titled "A title"
|
39
|
+
When I go to the list of events
|
40
|
+
And I follow "Edit this event" within ".actions"
|
41
|
+
Then I fill in "Title" with "A different title"
|
42
|
+
And I press "Save"
|
43
|
+
Then I should see "'A different title' was successfully updated."
|
44
|
+
And I should be on the list of events
|
45
|
+
And I should not see "A title"
|
46
|
+
|
47
|
+
@events-duplicate @duplicate
|
48
|
+
Scenario: Create Duplicate Event
|
49
|
+
Given I only have events titled UniqueTitleOne, UniqueTitleTwo
|
50
|
+
When I go to the list of events
|
51
|
+
And I follow "Add New Event"
|
52
|
+
And I fill in "Title" with "UniqueTitleTwo"
|
53
|
+
And I press "Save"
|
54
|
+
Then I should see "There were problems"
|
55
|
+
And I should have 2 events
|
56
|
+
|
57
|
+
@events-delete @delete
|
58
|
+
Scenario: Delete Event
|
59
|
+
Given I only have events titled UniqueTitleOne
|
60
|
+
When I go to the list of events
|
61
|
+
And I follow "Remove this event forever"
|
62
|
+
Then I should see "'UniqueTitleOne' was successfully removed."
|
63
|
+
And I should have 0 events
|
64
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
Given /^I have no events$/ do
|
2
|
+
Event.delete_all
|
3
|
+
end
|
4
|
+
|
5
|
+
Given /^I (only )?have events titled "?([^\"]*)"?$/ do |only, titles|
|
6
|
+
Event.delete_all if only
|
7
|
+
titles.split(', ').each do |title|
|
8
|
+
Factory(:event, :title => title)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
Then /^I should have ([0-9]+) events?$/ do |count|
|
13
|
+
Event.count.should == count.to_i
|
14
|
+
end
|
@@ -0,0 +1,6 @@
|
|
1
|
+
Factory.define :event do |f|
|
2
|
+
f.sequence(:title) { |n| "Top #{n} Shopping Centers in Chicago" }
|
3
|
+
f.description "These are the top ten shopping centers in Chicago. You're going to read a long blog post about them. Come to peace with it."
|
4
|
+
f.start_at Time.now
|
5
|
+
f.end_at Time.now.advance(:hours => 1)
|
6
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module NavigationHelpers
|
2
|
+
module Refinery
|
3
|
+
module Events
|
4
|
+
def path_to(page_name)
|
5
|
+
case page_name
|
6
|
+
when /the list of events/
|
7
|
+
admin_events_path
|
8
|
+
|
9
|
+
when /the new event form/
|
10
|
+
new_admin_event_path
|
11
|
+
else
|
12
|
+
nil
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'refinery'
|
2
|
+
|
3
|
+
module Refinery
|
4
|
+
module Events
|
5
|
+
class Engine < Rails::Engine
|
6
|
+
initializer "static assets" do |app|
|
7
|
+
app.middleware.insert_after ::ActionDispatch::Static, ::ActionDispatch::Static, "#{root}/public"
|
8
|
+
end
|
9
|
+
|
10
|
+
config.after_initialize do
|
11
|
+
Refinery::Plugin.register do |plugin|
|
12
|
+
plugin.name = "events"
|
13
|
+
plugin.activity = [{
|
14
|
+
:class => Event
|
15
|
+
}, {
|
16
|
+
:class => EventCategory
|
17
|
+
}]
|
18
|
+
plugin.menu_match = /^(admin|refinery)\/(event(_categorie)?s)/
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
.individual_event {
|
2
|
+
padding: 15px;
|
3
|
+
margin: 0 0 10px;
|
4
|
+
background-color: #f4f4f4;
|
5
|
+
}
|
6
|
+
.individual_event h1 {
|
7
|
+
margin: 0 0 10px;
|
8
|
+
padding: 0;
|
9
|
+
}
|
10
|
+
.individual_event .event_image {
|
11
|
+
float: left;
|
12
|
+
margin: 0 15px 10px 0;
|
13
|
+
}
|
14
|
+
#featured_events h2 {
|
15
|
+
margin: 15px 0 10px;
|
16
|
+
}
|
17
|
+
|
18
|
+
.sidebar_module {
|
19
|
+
padding: 15px;
|
20
|
+
}
|
21
|
+
.sidebar_module h2 {
|
22
|
+
margin: 0 0 10px;
|
23
|
+
}
|
24
|
+
.categories a {
|
25
|
+
display: block;
|
26
|
+
margin: 5px 0;
|
27
|
+
}
|
28
|
+
.sidebar_module ul {
|
29
|
+
list-style: square;
|
30
|
+
padding: 0 0 0 26px;
|
31
|
+
margin: 0;
|
32
|
+
}
|
33
|
+
.sidebar_module ul li {
|
34
|
+
margin: 2px 0;
|
35
|
+
padding: 2px 0;
|
36
|
+
}
|
37
|
+
|
38
|
+
#share_this_event {
|
39
|
+
border-top: 1px solid #ddd;
|
40
|
+
border-bottom: 1px solid #ddd;
|
41
|
+
padding: 20px 0;
|
42
|
+
margin: 20px 0;
|
43
|
+
}
|
44
|
+
#share_this_event ul {
|
45
|
+
list-style: none;
|
46
|
+
border: 0;
|
47
|
+
padding: 0;
|
48
|
+
margin: 0;
|
49
|
+
}
|
50
|
+
#share_this_event ul li {
|
51
|
+
float: left;
|
52
|
+
height: 70px;
|
53
|
+
margin: 0 15px 0 0;
|
54
|
+
}
|
55
|
+
|
56
|
+
#prevnext_nav {
|
57
|
+
clear: both;
|
58
|
+
display: block;
|
59
|
+
height: 100px;
|
60
|
+
}
|
61
|
+
#prevnext_nav .prev {
|
62
|
+
width: 33%;
|
63
|
+
float: left;
|
64
|
+
}
|
65
|
+
#prevnext_nav .home {
|
66
|
+
width: 33%;
|
67
|
+
float: left;
|
68
|
+
}
|
69
|
+
#prevnext_nav .next {
|
70
|
+
width: 33%;
|
71
|
+
float: left;
|
72
|
+
}
|
73
|
+
|
data/readme.md
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
# Events engine for Refinery CMS.
|
2
|
+
|
3
|
+
* Venue Details
|
4
|
+
* Ticket pricing & Link
|
5
|
+
* Mark featured events
|
6
|
+
* Specify a main image
|
7
|
+
* Archives
|
8
|
+
* Categories
|
9
|
+
* Basic layout and styling to get started immediately [blake0102](http://github.com/blake0102)
|
10
|
+
* Easily hook onto a few semantic CSS classes built into the markup [blake0102](http://github.com/blake0102)
|
11
|
+
* Basic Facebook & Twitter sharing interface
|
12
|
+
* RSS feed
|
13
|
+
|
14
|
+
# Install
|
15
|
+
|
16
|
+
Using Rails 3 / Bundler Gemfile:
|
17
|
+
|
18
|
+
gem 'refinerycms-calendar', '~>1.0'
|
19
|
+
|
20
|
+
bash:
|
21
|
+
|
22
|
+
bundle install
|
23
|
+
|
24
|
+
rails g refinerycms_calendar
|
25
|
+
|
26
|
+
rake db:migrate
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
Maintained by [joemsak](http://github.com/joemsak)
|
31
|
+
|
32
|
+
## TODO for 1.1 Release:
|
33
|
+
|
34
|
+
* Import events from Facebook fan page?
|
35
|
+
* JS datepicker in admin backend
|
36
|
+
* Calendar grid view? (can be kinda gross, honestly)
|
37
|
+
* iCal export
|
38
|
+
|
39
|
+
## TODO for 1.2
|
40
|
+
|
41
|
+
* Google map of address
|
42
|
+
* Address finder?
|
43
|
+
|
44
|
+
## Acknowledgements
|
45
|
+
|
46
|
+
* [Ed Blake](http://github.com/blake0102) structured semantic markup and design-minded workflow.
|
47
|
+
* [Neoteric Design, Inc.](http://www.neotericdesign.com) support and enthusiasm for my time & energy spent on helping the Refinery community.
|
48
|
+
* [Philip Arndt](http://github.com/parndt) Core team, RefineryCMS. Built the generator that makes this engine possible.
|
49
|
+
* [Resolve Digital](http://www.resolvedigital.com) The company behind the fabulous [RefineryCMS](http://www.refinerycms.com).
|
@@ -0,0 +1,17 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.platform = Gem::Platform::RUBY
|
3
|
+
s.name = 'refinerycms-calendar'
|
4
|
+
s.version = '1.0'
|
5
|
+
s.description = 'Ruby on Rails Events engine for Refinery CMS'
|
6
|
+
s.date = '2011-03-03'
|
7
|
+
s.summary = 'Events engine for Refinery CMS'
|
8
|
+
s.require_paths = %w(lib)
|
9
|
+
s.files = Dir['**/*']
|
10
|
+
s.authors = ["Neoteric Design", "Joe Sak", "Philip Arndt"]
|
11
|
+
s.email = %q{joe@neotericdesign.com}
|
12
|
+
s.homepage = "https://github.com/resolve/refinerycms-calendar"
|
13
|
+
|
14
|
+
s.add_dependency 'refinerycms', '>= 0.9.9'
|
15
|
+
end
|
16
|
+
|
17
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
Dir[File.expand_path('../../../features/support/factories/*.rb', __FILE__)].each{|factory| require factory}
|
3
|
+
|
4
|
+
describe EventsController do
|
5
|
+
|
6
|
+
describe "GET 'index' RSS" do
|
7
|
+
it "should be successful" do
|
8
|
+
get 'index', :format => :rss
|
9
|
+
response.should be_success
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
# Specs in this file have access to a helper object that includes
|
4
|
+
# the EventsHelper. For example:
|
5
|
+
#
|
6
|
+
# describe EventsHelper do
|
7
|
+
# describe "string concat" do
|
8
|
+
# it "concats two strings with spaces" do
|
9
|
+
# helper.concat_strings("this","that").should == "this that"
|
10
|
+
# end
|
11
|
+
# end
|
12
|
+
# end
|
13
|
+
|
14
|
+
# describe EventsHelper do
|
15
|
+
# pending "add some examples to (or delete) #{__FILE__}"
|
16
|
+
# end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
Dir[File.expand_path('../../../features/support/factories/*.rb', __FILE__)].each{|factory| require factory}
|
3
|
+
|
4
|
+
describe EventCategory do
|
5
|
+
before(:each) do
|
6
|
+
@attr = Factory(:event_category).attributes
|
7
|
+
end
|
8
|
+
|
9
|
+
context "validations" do
|
10
|
+
|
11
|
+
it "requires a name" do
|
12
|
+
EventCategory.new(@attr.merge(:name => nil)).should_not be_valid
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
context "events" do
|
18
|
+
it "can associate with many events" do
|
19
|
+
event1 = Factory(:event)
|
20
|
+
event2 = Factory(:event)
|
21
|
+
category = Factory(:event_category)
|
22
|
+
|
23
|
+
category.events << event1
|
24
|
+
category.events << event2
|
25
|
+
|
26
|
+
category.events.size.should be 2
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|