summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorhukl <contact@smyck.org>2009-03-16 20:58:49 +0100
committerhukl <contact@smyck.org>2009-03-18 12:16:59 +0100
commitd2bfbfd2810fbee673e43b2515db8bac527b3441 (patch)
tree1b46e8af44c871290a7a74ab17a8c7201e22f7a9 /app
parentd957a33a0d50f00c1968c5d12e728bd73ea186b3 (diff)
Refactored Chaos Calendar by wrapping libical and introducing event and occurrence model. More improvements to come. Enables us to create events with reoccurrence and intervals etc.
Diffstat (limited to 'app')
-rw-r--r--app/controllers/events_controller.rb85
-rw-r--r--app/controllers/occurrences_controller.rb85
-rw-r--r--app/helpers/events_helper.rb2
-rw-r--r--app/helpers/occurrences_helper.rb2
-rw-r--r--app/models/event.rb27
-rw-r--r--app/models/node.rb1
-rw-r--r--app/models/occurrence.rb60
-rw-r--r--app/views/events/edit.html.erb48
-rw-r--r--app/views/events/index.html.erb36
-rw-r--r--app/views/events/new.html.erb47
-rw-r--r--app/views/events/show.html.erb48
-rw-r--r--app/views/layouts/events.html.erb17
-rw-r--r--app/views/layouts/occurrences.html.erb17
-rw-r--r--app/views/occurrences/edit.html.erb32
-rw-r--r--app/views/occurrences/index.html.erb28
-rw-r--r--app/views/occurrences/new.html.erb31
-rw-r--r--app/views/occurrences/show.html.erb28
17 files changed, 594 insertions, 0 deletions
diff --git a/app/controllers/events_controller.rb b/app/controllers/events_controller.rb
new file mode 100644
index 0000000..c25c73f
--- /dev/null
+++ b/app/controllers/events_controller.rb
@@ -0,0 +1,85 @@
1class EventsController < ApplicationController
2 # GET /events
3 # GET /events.xml
4 def index
5 @events = Event.all
6
7 respond_to do |format|
8 format.html # index.html.erb
9 format.xml { render :xml => @events }
10 end
11 end
12
13 # GET /events/1
14 # GET /events/1.xml
15 def show
16 @event = Event.find(params[:id])
17
18 respond_to do |format|
19 format.html # show.html.erb
20 format.xml { render :xml => @event }
21 end
22 end
23
24 # GET /events/new
25 # GET /events/new.xml
26 def new
27 @event = Event.new
28
29 respond_to do |format|
30 format.html # new.html.erb
31 format.xml { render :xml => @event }
32 end
33 end
34
35 # GET /events/1/edit
36 def edit
37 @event = Event.find(params[:id])
38 end
39
40 # POST /events
41 # POST /events.xml
42 def create
43 @event = Event.new(params[:event])
44
45 respond_to do |format|
46 if @event.save
47 flash[:notice] = 'Event was successfully created.'
48 format.html { redirect_to(@event) }
49 format.xml { render :xml => @event, :status => :created, :location => @event }
50 else
51 format.html { render :action => "new" }
52 format.xml { render :xml => @event.errors, :status => :unprocessable_entity }
53 end
54 end
55 end
56
57 # PUT /events/1
58 # PUT /events/1.xml
59 def update
60 @event = Event.find(params[:id])
61
62 respond_to do |format|
63 if @event.update_attributes(params[:event])
64 flash[:notice] = 'Event was successfully updated.'
65 format.html { redirect_to(@event) }
66 format.xml { head :ok }
67 else
68 format.html { render :action => "edit" }
69 format.xml { render :xml => @event.errors, :status => :unprocessable_entity }
70 end
71 end
72 end
73
74 # DELETE /events/1
75 # DELETE /events/1.xml
76 def destroy
77 @event = Event.find(params[:id])
78 @event.destroy
79
80 respond_to do |format|
81 format.html { redirect_to(events_url) }
82 format.xml { head :ok }
83 end
84 end
85end
diff --git a/app/controllers/occurrences_controller.rb b/app/controllers/occurrences_controller.rb
new file mode 100644
index 0000000..e3f1cdd
--- /dev/null
+++ b/app/controllers/occurrences_controller.rb
@@ -0,0 +1,85 @@
1class OccurrencesController < ApplicationController
2 # GET /occurrences
3 # GET /occurrences.xml
4 def index
5 @occurrences = Occurrence.all
6
7 respond_to do |format|
8 format.html # index.html.erb
9 format.xml { render :xml => @occurrences }
10 end
11 end
12
13 # GET /occurrences/1
14 # GET /occurrences/1.xml
15 def show
16 @occurrence = Occurrence.find(params[:id])
17
18 respond_to do |format|
19 format.html # show.html.erb
20 format.xml { render :xml => @occurrence }
21 end
22 end
23
24 # GET /occurrences/new
25 # GET /occurrences/new.xml
26 def new
27 @occurrence = Occurrence.new
28
29 respond_to do |format|
30 format.html # new.html.erb
31 format.xml { render :xml => @occurrence }
32 end
33 end
34
35 # GET /occurrences/1/edit
36 def edit
37 @occurrence = Occurrence.find(params[:id])
38 end
39
40 # POST /occurrences
41 # POST /occurrences.xml
42 def create
43 @occurrence = Occurrence.new(params[:occurrence])
44
45 respond_to do |format|
46 if @occurrence.save
47 flash[:notice] = 'Occurrence was successfully created.'
48 format.html { redirect_to(@occurrence) }
49 format.xml { render :xml => @occurrence, :status => :created, :location => @occurrence }
50 else
51 format.html { render :action => "new" }
52 format.xml { render :xml => @occurrence.errors, :status => :unprocessable_entity }
53 end
54 end
55 end
56
57 # PUT /occurrences/1
58 # PUT /occurrences/1.xml
59 def update
60 @occurrence = Occurrence.find(params[:id])
61
62 respond_to do |format|
63 if @occurrence.update_attributes(params[:occurrence])
64 flash[:notice] = 'Occurrence was successfully updated.'
65 format.html { redirect_to(@occurrence) }
66 format.xml { head :ok }
67 else
68 format.html { render :action => "edit" }
69 format.xml { render :xml => @occurrence.errors, :status => :unprocessable_entity }
70 end
71 end
72 end
73
74 # DELETE /occurrences/1
75 # DELETE /occurrences/1.xml
76 def destroy
77 @occurrence = Occurrence.find(params[:id])
78 @occurrence.destroy
79
80 respond_to do |format|
81 format.html { redirect_to(occurrences_url) }
82 format.xml { head :ok }
83 end
84 end
85end
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 @@
1module EventsHelper
2end
diff --git a/app/helpers/occurrences_helper.rb b/app/helpers/occurrences_helper.rb
new file mode 100644
index 0000000..8cba881
--- /dev/null
+++ b/app/helpers/occurrences_helper.rb
@@ -0,0 +1,2 @@
1module OccurrencesHelper
2end
diff --git a/app/models/event.rb b/app/models/event.rb
new file mode 100644
index 0000000..60b8521
--- /dev/null
+++ b/app/models/event.rb
@@ -0,0 +1,27 @@
1class Event < ActiveRecord::Base
2
3 # Associations
4
5 has_many :occurrences
6 belongs_to :node
7
8 # Callbacks
9
10 after_save :generate_occurences
11
12 # Instance Methods
13
14 def occurrences_in_range start_time, end_time
15 self.occurrences.find(
16 :all, :conditions => [
17 "start_time > ? AND end_time < ?",
18 start_time, end_time
19 ]
20 )
21 end
22
23 private
24 def generate_occurences
25 Occurrence.generate self
26 end
27end
diff --git a/app/models/node.rb b/app/models/node.rb
index d2db4ba..da26164 100644
--- a/app/models/node.rb
+++ b/app/models/node.rb
@@ -7,6 +7,7 @@ class Node < ActiveRecord::Base
7 belongs_to :head, :class_name => "Page", :foreign_key => :head_id 7 belongs_to :head, :class_name => "Page", :foreign_key => :head_id
8 belongs_to :draft, :class_name => "Page", :foreign_key => :draft_id 8 belongs_to :draft, :class_name => "Page", :foreign_key => :draft_id
9 has_many :permissions 9 has_many :permissions
10 has_one :event
10 11
11 # Callbacks 12 # Callbacks
12 after_create :initialize_empty_page 13 after_create :initialize_empty_page
diff --git a/app/models/occurrence.rb b/app/models/occurrence.rb
new file mode 100644
index 0000000..6205618
--- /dev/null
+++ b/app/models/occurrence.rb
@@ -0,0 +1,60 @@
1# TODO Make a gem out of the c wrapper
2require 'lib/chaos_calendar/ical_occurrences'
3
4class Occurrence < ActiveRecord::Base
5
6 # Associations
7
8 belongs_to :node
9 belongs_to :event
10
11 # Class Methods
12
13 def self.find_in_range start_time, end_time
14 find(
15 :all, :conditions => [
16 "start_time > ? AND end_time < ?", start_time, end_time
17 ]
18 )
19 end
20
21 # Deletes all Occurrences which belong to the given event. Afterwards a few
22 # variables are set to save repetitive queries. The occurrences of the given
23 # event are then calculated and created.
24 def self.generate event
25 self.delete_all(:event_id => event.id)
26
27 node = event.node
28 summary = node.head.title
29 duration = (event.end_time - event.start_time)
30 occurrences = self.generate_dates(event)
31
32 occurrences.each do |occurrence|
33 self.create(
34 :summary => summary,
35 :start_time => occurrence,
36 :end_time => (occurrence + duration),
37 :node_id => node.id,
38 :event_id => event.id
39 )
40 end
41 end
42
43 # Calculates the start_time of all occurrences for a given event if a proper
44 # RRule is provided. An ArgumentError is thrown from within the libical
45 # wrapper if the RRule is malformed. If the rrule attribute of an event is
46 # nil, it simply returns the event start_time as only occurrence.
47 # Return value is always an array of Time objects.
48 def self.generate_dates event
49 if event.rrule
50 Ical_occurrences::occurrences(
51 event.start_time.utc.iso8601,
52 (Time.now + 5.years).utc.iso8601,
53 event.rrule
54 )
55 else
56 [event.start_time]
57 end
58
59 end
60end
diff --git a/app/views/events/edit.html.erb b/app/views/events/edit.html.erb
new file mode 100644
index 0000000..e40ac55
--- /dev/null
+++ b/app/views/events/edit.html.erb
@@ -0,0 +1,48 @@
1<h1>Editing event</h1>
2
3<% form_for(@event) do |f| %>
4 <%= f.error_messages %>
5
6 <p>
7 <%= f.label :start_time %><br />
8 <%= f.datetime_select :start_time %>
9 </p>
10 <p>
11 <%= f.label :end_time %><br />
12 <%= f.datetime_select :end_time %>
13 </p>
14 <p>
15 <%= f.label :rrule %><br />
16 <%= f.text_field :rrule %>
17 </p>
18 <p>
19 <%= f.label :custom_rrule %><br />
20 <%= f.check_box :custom_rrule %>
21 </p>
22 <p>
23 <%= f.label :allday %><br />
24 <%= f.check_box :allday %>
25 </p>
26 <p>
27 <%= f.label :url %><br />
28 <%= f.text_field :url %>
29 </p>
30 <p>
31 <%= f.label :latitude %><br />
32 <%= f.text_field :latitude %>
33 </p>
34 <p>
35 <%= f.label :longitude %><br />
36 <%= f.text_field :longitude %>
37 </p>
38 <p>
39 <%= f.label :node_id %><br />
40 <%= f.text_field :node_id %>
41 </p>
42 <p>
43 <%= f.submit 'Update' %>
44 </p>
45<% end %>
46
47<%= link_to 'Show', @event %> |
48<%= link_to 'Back', events_path %> \ No newline at end of file
diff --git a/app/views/events/index.html.erb b/app/views/events/index.html.erb
new file mode 100644
index 0000000..c1b5b48
--- /dev/null
+++ b/app/views/events/index.html.erb
@@ -0,0 +1,36 @@
1<h1>Listing events</h1>
2
3<table>
4 <tr>
5 <th>Start time</th>
6 <th>End time</th>
7 <th>Rrule</th>
8 <th>Custom rrule</th>
9 <th>Allday</th>
10 <th>Url</th>
11 <th>Latitude</th>
12 <th>Longitude</th>
13 <th>Node</th>
14 </tr>
15
16<% @events.each do |event| %>
17 <tr>
18 <td><%=h event.start_time %></td>
19 <td><%=h event.end_time %></td>
20 <td><%=h event.rrule %></td>
21 <td><%=h event.custom_rrule %></td>
22 <td><%=h event.allday %></td>
23 <td><%=h event.url %></td>
24 <td><%=h event.latitude %></td>
25 <td><%=h event.longitude %></td>
26 <td><%=h event.node_id %></td>
27 <td><%= link_to 'Show', event %></td>
28 <td><%= link_to 'Edit', edit_event_path(event) %></td>
29 <td><%= link_to 'Destroy', event, :confirm => 'Are you sure?', :method => :delete %></td>
30 </tr>
31<% end %>
32</table>
33
34<br />
35
36<%= link_to 'New event', new_event_path %> \ No newline at end of file
diff --git a/app/views/events/new.html.erb b/app/views/events/new.html.erb
new file mode 100644
index 0000000..0182b07
--- /dev/null
+++ b/app/views/events/new.html.erb
@@ -0,0 +1,47 @@
1<h1>New event</h1>
2
3<% form_for(@event) do |f| %>
4 <%= f.error_messages %>
5
6 <p>
7 <%= f.label :start_time %><br />
8 <%= f.datetime_select :start_time %>
9 </p>
10 <p>
11 <%= f.label :end_time %><br />
12 <%= f.datetime_select :end_time %>
13 </p>
14 <p>
15 <%= f.label :rrule %><br />
16 <%= f.text_field :rrule %>
17 </p>
18 <p>
19 <%= f.label :custom_rrule %><br />
20 <%= f.check_box :custom_rrule %>
21 </p>
22 <p>
23 <%= f.label :allday %><br />
24 <%= f.check_box :allday %>
25 </p>
26 <p>
27 <%= f.label :url %><br />
28 <%= f.text_field :url %>
29 </p>
30 <p>
31 <%= f.label :latitude %><br />
32 <%= f.text_field :latitude %>
33 </p>
34 <p>
35 <%= f.label :longitude %><br />
36 <%= f.text_field :longitude %>
37 </p>
38 <p>
39 <%= f.label :node_id %><br />
40 <%= f.text_field :node_id %>
41 </p>
42 <p>
43 <%= f.submit 'Create' %>
44 </p>
45<% end %>
46
47<%= link_to 'Back', events_path %> \ No newline at end of file
diff --git a/app/views/events/show.html.erb b/app/views/events/show.html.erb
new file mode 100644
index 0000000..699765d
--- /dev/null
+++ b/app/views/events/show.html.erb
@@ -0,0 +1,48 @@
1<p>
2 <b>Start time:</b>
3 <%=h @event.start_time %>
4</p>
5
6<p>
7 <b>End time:</b>
8 <%=h @event.end_time %>
9</p>
10
11<p>
12 <b>Rrule:</b>
13 <%=h @event.rrule %>
14</p>
15
16<p>
17 <b>Custom rrule:</b>
18 <%=h @event.custom_rrule %>
19</p>
20
21<p>
22 <b>Allday:</b>
23 <%=h @event.allday %>
24</p>
25
26<p>
27 <b>Url:</b>
28 <%=h @event.url %>
29</p>
30
31<p>
32 <b>Latitude:</b>
33 <%=h @event.latitude %>
34</p>
35
36<p>
37 <b>Longitude:</b>
38 <%=h @event.longitude %>
39</p>
40
41<p>
42 <b>Node:</b>
43 <%=h @event.node_id %>
44</p>
45
46
47<%= link_to 'Edit', edit_event_path(@event) %> |
48<%= link_to 'Back', events_path %> \ No newline at end of file
diff --git a/app/views/layouts/events.html.erb b/app/views/layouts/events.html.erb
new file mode 100644
index 0000000..93a6c0c
--- /dev/null
+++ b/app/views/layouts/events.html.erb
@@ -0,0 +1,17 @@
1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
4<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5<head>
6 <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
7 <title>Events: <%= controller.action_name %></title>
8 <%= stylesheet_link_tag 'scaffold' %>
9</head>
10<body>
11
12<p style="color: green"><%= flash[:notice] %></p>
13
14<%= yield %>
15
16</body>
17</html>
diff --git a/app/views/layouts/occurrences.html.erb b/app/views/layouts/occurrences.html.erb
new file mode 100644
index 0000000..ab4aca6
--- /dev/null
+++ b/app/views/layouts/occurrences.html.erb
@@ -0,0 +1,17 @@
1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
4<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5<head>
6 <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
7 <title>Occurrences: <%= controller.action_name %></title>
8 <%= stylesheet_link_tag 'scaffold' %>
9</head>
10<body>
11
12<p style="color: green"><%= flash[:notice] %></p>
13
14<%= yield %>
15
16</body>
17</html>
diff --git a/app/views/occurrences/edit.html.erb b/app/views/occurrences/edit.html.erb
new file mode 100644
index 0000000..6a81188
--- /dev/null
+++ b/app/views/occurrences/edit.html.erb
@@ -0,0 +1,32 @@
1<h1>Editing occurrence</h1>
2
3<% form_for(@occurrence) do |f| %>
4 <%= f.error_messages %>
5
6 <p>
7 <%= f.label :summary %><br />
8 <%= f.text_field :summary %>
9 </p>
10 <p>
11 <%= f.label :start_time %><br />
12 <%= f.datetime_select :start_time %>
13 </p>
14 <p>
15 <%= f.label :end_time %><br />
16 <%= f.datetime_select :end_time %>
17 </p>
18 <p>
19 <%= f.label :node_id %><br />
20 <%= f.text_field :node_id %>
21 </p>
22 <p>
23 <%= f.label :event_id %><br />
24 <%= f.text_field :event_id %>
25 </p>
26 <p>
27 <%= f.submit 'Update' %>
28 </p>
29<% end %>
30
31<%= link_to 'Show', @occurrence %> |
32<%= link_to 'Back', occurrences_path %> \ No newline at end of file
diff --git a/app/views/occurrences/index.html.erb b/app/views/occurrences/index.html.erb
new file mode 100644
index 0000000..06dbf07
--- /dev/null
+++ b/app/views/occurrences/index.html.erb
@@ -0,0 +1,28 @@
1<h1>Listing occurrences</h1>
2
3<table>
4 <tr>
5 <th>Summary</th>
6 <th>Start time</th>
7 <th>End time</th>
8 <th>Node</th>
9 <th>Event</th>
10 </tr>
11
12<% @occurrences.each do |occurrence| %>
13 <tr>
14 <td><%=h occurrence.summary %></td>
15 <td><%=h occurrence.start_time %></td>
16 <td><%=h occurrence.end_time %></td>
17 <td><%=h occurrence.node_id %></td>
18 <td><%=h occurrence.event_id %></td>
19 <td><%= link_to 'Show', occurrence %></td>
20 <td><%= link_to 'Edit', edit_occurrence_path(occurrence) %></td>
21 <td><%= link_to 'Destroy', occurrence, :confirm => 'Are you sure?', :method => :delete %></td>
22 </tr>
23<% end %>
24</table>
25
26<br />
27
28<%= link_to 'New occurrence', new_occurrence_path %> \ No newline at end of file
diff --git a/app/views/occurrences/new.html.erb b/app/views/occurrences/new.html.erb
new file mode 100644
index 0000000..0a77af1
--- /dev/null
+++ b/app/views/occurrences/new.html.erb
@@ -0,0 +1,31 @@
1<h1>New occurrence</h1>
2
3<% form_for(@occurrence) do |f| %>
4 <%= f.error_messages %>
5
6 <p>
7 <%= f.label :summary %><br />
8 <%= f.text_field :summary %>
9 </p>
10 <p>
11 <%= f.label :start_time %><br />
12 <%= f.datetime_select :start_time %>
13 </p>
14 <p>
15 <%= f.label :end_time %><br />
16 <%= f.datetime_select :end_time %>
17 </p>
18 <p>
19 <%= f.label :node_id %><br />
20 <%= f.text_field :node_id %>
21 </p>
22 <p>
23 <%= f.label :event_id %><br />
24 <%= f.text_field :event_id %>
25 </p>
26 <p>
27 <%= f.submit 'Create' %>
28 </p>
29<% end %>
30
31<%= link_to 'Back', occurrences_path %> \ No newline at end of file
diff --git a/app/views/occurrences/show.html.erb b/app/views/occurrences/show.html.erb
new file mode 100644
index 0000000..9e831cf
--- /dev/null
+++ b/app/views/occurrences/show.html.erb
@@ -0,0 +1,28 @@
1<p>
2 <b>Summary:</b>
3 <%=h @occurrence.summary %>
4</p>
5
6<p>
7 <b>Start time:</b>
8 <%=h @occurrence.start_time %>
9</p>
10
11<p>
12 <b>End time:</b>
13 <%=h @occurrence.end_time %>
14</p>
15
16<p>
17 <b>Node:</b>
18 <%=h @occurrence.node_id %>
19</p>
20
21<p>
22 <b>Event:</b>
23 <%=h @occurrence.event_id %>
24</p>
25
26
27<%= link_to 'Edit', edit_occurrence_path(@occurrence) %> |
28<%= link_to 'Back', occurrences_path %> \ No newline at end of file