From 26687eaf7400aea5d569f99e880ac3949982f303 Mon Sep 17 00:00:00 2001 From: erdgeist Date: Tue, 10 Mar 2009 21:03:52 +0100 Subject: added calendar backend. more features and integration to come --- app/controllers/events_controller.rb | 85 +++++++++++++++++++++++++++++++ app/helpers/events_helper.rb | 2 + app/models/event.rb | 2 + app/views/events/edit.html.erb | 16 ++++++ app/views/events/index.html.erb | 20 ++++++++ app/views/events/new.html.erb | 15 ++++++ app/views/events/show.html.erb | 8 +++ app/views/layouts/events.html.erb | 17 +++++++ config/routes.rb | 1 + lib/chaos_calendar.rb | 1 + test/fixtures/events.yml | 7 +++ test/functional/events_controller_test.rb | 45 ++++++++++++++++ test/unit/event_test.rb | 77 ++++++++++++++++++++++++++++ test/unit/helpers/events_helper_test.rb | 4 ++ 14 files changed, 300 insertions(+) create mode 100644 app/controllers/events_controller.rb create mode 100644 app/helpers/events_helper.rb create mode 100644 app/models/event.rb create mode 100644 app/views/events/edit.html.erb create mode 100644 app/views/events/index.html.erb create mode 100644 app/views/events/new.html.erb create mode 100644 app/views/events/show.html.erb create mode 100644 app/views/layouts/events.html.erb create mode 100644 test/fixtures/events.yml create mode 100644 test/functional/events_controller_test.rb create mode 100644 test/unit/event_test.rb create mode 100644 test/unit/helpers/events_helper_test.rb diff --git a/app/controllers/events_controller.rb b/app/controllers/events_controller.rb new file mode 100644 index 0000000..063b7a1 --- /dev/null +++ b/app/controllers/events_controller.rb @@ -0,0 +1,85 @@ +class EventsController < ApplicationController + # GET /events + # GET /events.xml + def index + @events = Event.find(:all) + + respond_to do |format| + format.html # index.html.erb + format.xml { render :xml => @events } + end + end + + # GET /events/1 + # GET /events/1.xml + def show + @event = Event.find(params[:id]) + + respond_to do |format| + format.html # show.html.erb + format.xml { render :xml => @event } + end + end + + # GET /events/new + # GET /events/new.xml + def new + @event = Event.new + + respond_to do |format| + format.html # new.html.erb + format.xml { render :xml => @event } + end + end + + # GET /events/1/edit + def edit + @event = Event.find(params[:id]) + end + + # POST /events + # POST /events.xml + def create + @event = Event.new(params[:event]) + + respond_to do |format| + if @event.save + flash[:notice] = 'Event was successfully created.' + format.html { redirect_to(@event) } + format.xml { render :xml => @event, :status => :created, :location => @event } + else + format.html { render :action => "new" } + format.xml { render :xml => @event.errors, :status => :unprocessable_entity } + end + end + end + + # PUT /events/1 + # PUT /events/1.xml + def update + @event = Event.find(params[:id]) + + respond_to do |format| + if @event.update_attributes(params[:event]) + flash[:notice] = 'Event was successfully updated.' + format.html { redirect_to(@event) } + format.xml { head :ok } + else + format.html { render :action => "edit" } + format.xml { render :xml => @event.errors, :status => :unprocessable_entity } + end + end + end + + # DELETE /events/1 + # DELETE /events/1.xml + def destroy + @event = Event.find(params[:id]) + @event.destroy + + respond_to do |format| + format.html { redirect_to(events_url) } + format.xml { head :ok } + end + end +end diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb new file mode 100644 index 0000000..8a9a878 --- /dev/null +++ b/app/helpers/events_helper.rb @@ -0,0 +1,2 @@ +module EventsHelper +end diff --git a/app/models/event.rb b/app/models/event.rb new file mode 100644 index 0000000..3a829fd --- /dev/null +++ b/app/models/event.rb @@ -0,0 +1,2 @@ +class Event < ActiveRecord::Base +end diff --git a/app/views/events/edit.html.erb b/app/views/events/edit.html.erb new file mode 100644 index 0000000..244f35f --- /dev/null +++ b/app/views/events/edit.html.erb @@ -0,0 +1,16 @@ +

Editing event

+ +<% form_for(@event) do |f| %> + <%= f.error_messages %> + +

+ <%= f.label :serialized_event %>
+ <%= f.text_area :serialized_event %> +

+

+ <%= f.submit "Update" %> +

+<% end %> + +<%= link_to 'Show', @event %> | +<%= link_to 'Back', events_path %> diff --git a/app/views/events/index.html.erb b/app/views/events/index.html.erb new file mode 100644 index 0000000..ad0ca8d --- /dev/null +++ b/app/views/events/index.html.erb @@ -0,0 +1,20 @@ +

Listing events

+ + + + + + +<% for event in @events %> + + + + + + +<% end %> +
Serialized event
<%=h event.serialized_event %><%= link_to 'Show', event %><%= link_to 'Edit', edit_event_path(event) %><%= link_to 'Destroy', event, :confirm => 'Are you sure?', :method => :delete %>
+ +
+ +<%= link_to 'New event', new_event_path %> diff --git a/app/views/events/new.html.erb b/app/views/events/new.html.erb new file mode 100644 index 0000000..44f4bb4 --- /dev/null +++ b/app/views/events/new.html.erb @@ -0,0 +1,15 @@ +

New event

+ +<% form_for(@event) do |f| %> + <%= f.error_messages %> + +

+ <%= f.label :serialized_event %>
+ <%= f.text_area :serialized_event %> +

+

+ <%= f.submit "Create" %> +

+<% end %> + +<%= link_to 'Back', events_path %> diff --git a/app/views/events/show.html.erb b/app/views/events/show.html.erb new file mode 100644 index 0000000..ad9c582 --- /dev/null +++ b/app/views/events/show.html.erb @@ -0,0 +1,8 @@ +

+ Serialized event: + <%=h @event.serialized_event %> +

+ + +<%= link_to 'Edit', edit_event_path(@event) %> | +<%= link_to 'Back', events_path %> diff --git a/app/views/layouts/events.html.erb b/app/views/layouts/events.html.erb new file mode 100644 index 0000000..6201c57 --- /dev/null +++ b/app/views/layouts/events.html.erb @@ -0,0 +1,17 @@ + + + + + + Events: <%= controller.action_name %> + <%= stylesheet_link_tag 'scaffold' %> + + + +

<%= flash[:notice] %>

+ +<%= yield %> + + + diff --git a/config/routes.rb b/config/routes.rb index 4305a21..33216b3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -10,6 +10,7 @@ ActionController::Routing::Routes.draw do |map| map.resources :pages map.resources :nodes, :member => {:publish => :put, :unlock => :put} + map.resources :events map.logout '/logout', :controller => 'sessions', :action => 'destroy' map.login '/login', :controller => 'sessions', :action => 'new' diff --git a/lib/chaos_calendar.rb b/lib/chaos_calendar.rb index 22ad934..94ad258 100644 --- a/lib/chaos_calendar.rb +++ b/lib/chaos_calendar.rb @@ -10,6 +10,7 @@ class Occurrence end class ChaosCalendar + attr_reader :calendar def initialize @calendar = {} end diff --git a/test/fixtures/events.yml b/test/fixtures/events.yml new file mode 100644 index 0000000..6d43f1d --- /dev/null +++ b/test/fixtures/events.yml @@ -0,0 +1,7 @@ +# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html + +one: + serialized_event: MyText + +two: + serialized_event: MyText diff --git a/test/functional/events_controller_test.rb b/test/functional/events_controller_test.rb new file mode 100644 index 0000000..24a6f94 --- /dev/null +++ b/test/functional/events_controller_test.rb @@ -0,0 +1,45 @@ +require 'test_helper' + +class EventsControllerTest < ActionController::TestCase + test "should get index" do + get :index + assert_response :success + assert_not_nil assigns(:events) + end + + test "should get new" do + get :new + assert_response :success + end + + test "should create event" do + assert_difference('Event.count') do + post :create, :event => { } + end + + assert_redirected_to event_path(assigns(:event)) + end + + test "should show event" do + get :show, :id => events(:one).id + assert_response :success + end + + test "should get edit" do + get :edit, :id => events(:one).id + assert_response :success + end + + test "should update event" do + put :update, :id => events(:one).id, :event => { } + assert_redirected_to event_path(assigns(:event)) + end + + test "should destroy event" do + assert_difference('Event.count', -1) do + delete :destroy, :id => events(:one).id + end + + assert_redirected_to events_path + end +end diff --git a/test/unit/event_test.rb b/test/unit/event_test.rb new file mode 100644 index 0000000..c8ee335 --- /dev/null +++ b/test/unit/event_test.rb @@ -0,0 +1,77 @@ +require 'test_helper' + +class EventTest < ActiveSupport::TestCase + + def setup + @cal = <<-EOT +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Ensemble Independent//vPim 0.658//EN +CALSCALE:Gregorian +BEGIN:VEVENT +SUMMARY:Chaosradio +DTSTART:20080505T220000 +LOCATION:FM 102,60 MHz +URL:http://www.fritz.de/frequenzen +RRULE:FREQ=MONTHLY;BYMONTH=1,2,3,4,5,6,7,8,9,10,11;BYDAY=-1WE;UNTIL=20091105T220000 +CREATED:20021020T220000 +DURATION:PT3H +END:VEVENT +END:VCALENDAR + EOT + + @first_child = Node.find(2) + end + + test 'saving serialized event' do + assert event = Event.create!( :serialized_event => @cal ) + end + + test 'parsing calendar data' do + event = Event.create!( :serialized_event => @cal ) + assert calendar = ChaosCalendar.new + assert calendar.push( event.serialized_event, @first_child.id ) + assert_equal 1, calendar.calendar.length + assert_equal "Chaosradio", calendar.calendar.to_a.first.first.summary + end + + test 'checking occurrences logic' do + event = Event.create!( :serialized_event => @cal ) + calendar = ChaosCalendar.new + calendar.push( event.serialized_event, @first_child.id ) + + all_occurrences = calendar.occurrences( "2009-03-22".to_datetime, "2010-01-10".to_datetime ) + assert_equal 8, all_occurrences.length + + assert_equal "2009-03-25".to_date, all_occurrences.first.dtstart.to_date + assert_equal "2009-10-28".to_date, all_occurrences.last.dtstart.to_date + end + +end + +__END__ + +opt_days = 7 + +calendar = ChaosCalendar.new + + +calendar.push( cal, 25 ) +t0 = Time.today +t1 = t0 + opt_days.days + +all_occurrences = calendar.occurrences( t0, t1 ) + +all_occurrences.each do |o| + e = o.event + puts o.dtstart + puts "#{e.summary}:" + + puts " description=#{e.description}" if e.description + puts " comment=#{e.comments.first}" if e.comments + puts " location=#{e.location}" if e.location + puts " status=#{e.status}" if e.status + puts " dtstart=#{e.dtstart}" if e.dtstart + puts " duration=#{Vpim::Duration.new(e.duration).to_s}" if e.duration +end + diff --git a/test/unit/helpers/events_helper_test.rb b/test/unit/helpers/events_helper_test.rb new file mode 100644 index 0000000..2e7567e --- /dev/null +++ b/test/unit/helpers/events_helper_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class EventsHelperTest < ActionView::TestCase +end -- cgit v1.3