radiant-event_calendar-extension 1.0.2 → 1.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/VERSION +1 -1
- data/app/controllers/admin/events_controller.rb +8 -2
- data/app/controllers/admin/icals_controller.rb +2 -2
- data/app/controllers/events_controller.rb +1 -1
- data/app/models/event.rb +30 -14
- data/app/models/event_venue.rb +5 -7
- data/app/models/ical.rb +6 -2
- data/app/views/admin/calendars/_form.html.haml +49 -35
- data/app/views/admin/calendars/edit.html.haml +0 -1
- data/app/views/admin/event_venues/_event_venue.html.haml +1 -1
- data/app/views/admin/event_venues/_form.html.haml +36 -32
- data/app/views/admin/event_venues/edit.html.haml +6 -1
- data/app/views/admin/event_venues/new.html.haml +6 -1
- data/app/views/admin/events/_event.html.haml +6 -11
- data/app/views/admin/events/_form.html.haml +87 -83
- data/app/views/admin/events/edit.html.haml +6 -1
- data/app/views/admin/events/new.html.haml +6 -1
- data/app/views/events/_event.html.haml +11 -3
- data/db/migrate/20100216080944_more_event_data.rb +1 -1
- data/db/migrate/20100927140126_amended_events.rb +11 -0
- data/db/migrate/20100927203940_calendar_keywords.rb +14 -0
- data/lib/event_calendar_admin_ui.rb +4 -4
- data/pkg/radiant-event_calendar-extension-1.0.2.gem +0 -0
- data/public/stylesheets/sass/event_calendar.sass +278 -202
- data/radiant-event_calendar-extension.gemspec +5 -2
- metadata +6 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0
|
1
|
+
1.1.0
|
@@ -2,8 +2,14 @@ class Admin::EventsController < Admin::ResourceController
|
|
2
2
|
paginate_models :per_page => 20
|
3
3
|
|
4
4
|
def load_models
|
5
|
-
|
6
|
-
|
5
|
+
pp = pagination_parameters
|
6
|
+
unless params[:p]
|
7
|
+
first_event = Event.future_and_current.first
|
8
|
+
i = Event.all.index(first_event)
|
9
|
+
p = (i / pp[:per_page].to_i) + 1
|
10
|
+
pp[:page] = p if p && p > 1
|
11
|
+
end
|
12
|
+
self.models = Event.paginate(pp)
|
7
13
|
end
|
8
14
|
|
9
15
|
end
|
@@ -15,8 +15,8 @@ class Admin::IcalsController < Admin::ResourceController
|
|
15
15
|
|
16
16
|
def refresh
|
17
17
|
ical = Ical.find(params[:id])
|
18
|
-
if ical.refresh
|
19
|
-
flash[:notice] = ical.calendar.name + " calendar refreshed from iCal subscription
|
18
|
+
if events = ical.refresh
|
19
|
+
flash[:notice] = ical.calendar.name + " calendar refreshed from iCal subscription."
|
20
20
|
else
|
21
21
|
flash[:notice] = "Error parsing " + ical.calendar.name + " calendar from iCal subscription."
|
22
22
|
end
|
@@ -5,7 +5,7 @@ class EventsController < SiteController
|
|
5
5
|
helper_method :url_for_date, :url_for_month, :url_without_period, :calendar_parameters, :month_name, :short_month_name, :day_names
|
6
6
|
before_filter :numerical_parameters
|
7
7
|
|
8
|
-
radiant_layout {
|
8
|
+
radiant_layout { Radiant::Config['event_calendar.layout'] }
|
9
9
|
no_login_required
|
10
10
|
|
11
11
|
# delivers designated lists of events in minimal formats
|
data/app/models/event.rb
CHANGED
@@ -123,6 +123,22 @@ class Event < ActiveRecord::Base
|
|
123
123
|
calendar.slug if calendar
|
124
124
|
end
|
125
125
|
|
126
|
+
def location
|
127
|
+
if event_venue
|
128
|
+
event_venue.to_s
|
129
|
+
else
|
130
|
+
read_attribute(:location)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def address
|
135
|
+
event_venue.address if event_venue
|
136
|
+
end
|
137
|
+
|
138
|
+
def postcode
|
139
|
+
event_venue.postcode if event_venue
|
140
|
+
end
|
141
|
+
|
126
142
|
def description_paragraph
|
127
143
|
if description =~ /\<p/
|
128
144
|
description
|
@@ -142,19 +158,7 @@ class Event < ActiveRecord::Base
|
|
142
158
|
def occurrence?
|
143
159
|
!master?
|
144
160
|
end
|
145
|
-
|
146
|
-
def location
|
147
|
-
event_venue ? event_venue.to_s : read_attribute(:location)
|
148
|
-
end
|
149
161
|
|
150
|
-
def address
|
151
|
-
event_venue ? event_venue.address : read_attribute(:location)
|
152
|
-
end
|
153
|
-
|
154
|
-
def postcode
|
155
|
-
event_venue ? event_venue.postcode : read_attribute(:postcode)
|
156
|
-
end
|
157
|
-
|
158
162
|
def date
|
159
163
|
start_date.to_datetime.strftime(date_format)
|
160
164
|
end
|
@@ -285,6 +289,10 @@ class Event < ActiveRecord::Base
|
|
285
289
|
def continuing?
|
286
290
|
end_date && start_date < Time.now && end_date > Time.now
|
287
291
|
end
|
292
|
+
|
293
|
+
def finished?
|
294
|
+
start_date < Time.now && (!end_date || end_date < Time.now)
|
295
|
+
end
|
288
296
|
|
289
297
|
def editable?
|
290
298
|
status != Status[:imported]
|
@@ -332,7 +340,6 @@ class Event < ActiveRecord::Base
|
|
332
340
|
:uuid => cal_event.uid,
|
333
341
|
:title => cal_event.summary,
|
334
342
|
:description => cal_event.description,
|
335
|
-
:location => cal_event.location,
|
336
343
|
:url => cal_event.url,
|
337
344
|
:start_date => cal_event.dtstart,
|
338
345
|
:end_date => cal_event.dtend,
|
@@ -340,6 +347,7 @@ class Event < ActiveRecord::Base
|
|
340
347
|
:created_at => cal_event.dtstamp
|
341
348
|
})
|
342
349
|
event.status = Status[:imported]
|
350
|
+
event.set_venue_from_location(cal_event.location)
|
343
351
|
cal_event.rrule.each { |rule| event.add_recurrence(rule) }
|
344
352
|
event
|
345
353
|
rescue => error
|
@@ -348,23 +356,31 @@ class Event < ActiveRecord::Base
|
|
348
356
|
end
|
349
357
|
|
350
358
|
def update_from(cal_event)
|
359
|
+
#TODO handle and merge local updates
|
351
360
|
self.update_attributes({
|
352
361
|
:title => cal_event.summary,
|
353
362
|
:description => cal_event.description,
|
354
|
-
:location => cal_event.location,
|
355
363
|
:url => cal_event.url,
|
356
364
|
:start_date => cal_event.dtstart,
|
357
365
|
:end_date => cal_event.dtend,
|
358
366
|
:all_day => !cal_event.dtstart.is_a?(DateTime)
|
359
367
|
})
|
360
368
|
self.status = Status[:imported]
|
369
|
+
self.set_venue_from_location(cal_event.location)
|
361
370
|
cal_event.rrule.each { |rule| self.add_recurrence(rule) }
|
371
|
+
self.save!
|
362
372
|
self
|
363
373
|
rescue => error
|
364
374
|
logger.error "Event update error: #{error}."
|
365
375
|
raise
|
366
376
|
end
|
367
377
|
|
378
|
+
def set_venue_from_location(location='')
|
379
|
+
unless location.blank?
|
380
|
+
self.event_venue = EventVenue.find_by_title(location) || EventVenue.find_or_create_by_location(location)
|
381
|
+
end
|
382
|
+
end
|
383
|
+
|
368
384
|
protected
|
369
385
|
|
370
386
|
def set_uuid
|
data/app/models/event_venue.rb
CHANGED
@@ -1,17 +1,15 @@
|
|
1
1
|
class EventVenue < ActiveRecord::Base
|
2
2
|
has_many :events, :dependent => :nullify
|
3
3
|
has_site if respond_to? :has_site
|
4
|
-
validates_presence_of :title, :address
|
5
4
|
default_scope :order => 'title asc'
|
6
5
|
|
7
6
|
def to_s
|
8
|
-
|
7
|
+
title
|
9
8
|
end
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
def location=(location)
|
15
|
-
address = location
|
10
|
+
# location is the string read in automatically from ical subscriptions
|
11
|
+
def title
|
12
|
+
read_attribute(:title) || location
|
16
13
|
end
|
14
|
+
|
17
15
|
end
|
data/app/models/ical.rb
CHANGED
@@ -13,8 +13,9 @@ class Ical < ActiveRecord::Base
|
|
13
13
|
|
14
14
|
def refresh
|
15
15
|
retrieve_file
|
16
|
-
parse_file
|
16
|
+
updated = parse_file
|
17
17
|
logger.info self.calendar.category + "/" + self.calendar.name + " - iCalendar subscription refreshed on " + Time.now.strftime("%m/%d at %H:%M")
|
18
|
+
updated
|
18
19
|
end
|
19
20
|
|
20
21
|
def retrieve_file
|
@@ -40,6 +41,7 @@ class Ical < ActiveRecord::Base
|
|
40
41
|
end
|
41
42
|
|
42
43
|
def parse_file(thisfile=filename)
|
44
|
+
affected = []
|
43
45
|
begin
|
44
46
|
Ical.transaction do
|
45
47
|
self.last_refresh_count = 0
|
@@ -50,7 +52,7 @@ class Ical < ActiveRecord::Base
|
|
50
52
|
cal.events.each do |cal_event|
|
51
53
|
if event = Event.find_by_uuid(cal_event.uid)
|
52
54
|
if cal_event.dtstamp > event.updated_at
|
53
|
-
event.update_from(cal_event)
|
55
|
+
affected.push event.update_from(cal_event)
|
54
56
|
else
|
55
57
|
end
|
56
58
|
event_count += 1
|
@@ -59,12 +61,14 @@ class Ical < ActiveRecord::Base
|
|
59
61
|
event.site = self.calendar.site if event.respond_to? :site=
|
60
62
|
self.calendar.events << event
|
61
63
|
event.save!
|
64
|
+
affected.push event
|
62
65
|
end
|
63
66
|
end
|
64
67
|
end
|
65
68
|
self.last_refresh_count = event_count
|
66
69
|
self.last_refresh_date = Time.now.utc
|
67
70
|
self.save!
|
71
|
+
affected
|
68
72
|
end
|
69
73
|
rescue => error
|
70
74
|
logger.error "RiCal parse error with: #{self.calendar.name}: #{error}."
|
@@ -1,50 +1,64 @@
|
|
1
|
+
- @calendar.build_ical unless @calendar.ical
|
2
|
+
|
1
3
|
#calendar_form.form-area
|
2
4
|
= render_region :form_top
|
3
5
|
= error_messages_for :calendar
|
4
6
|
|
5
|
-
|
6
|
-
- form
|
7
|
-
.
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
= f.label :slug
|
16
|
-
= f.text_field :slug, :class => "textbox"
|
17
|
-
%p.note
|
18
|
-
The category and slug are used create a url in the form /[calendar page]/category/slug showing only the events of this calendar.
|
19
|
-
|
20
|
-
.description
|
21
|
-
%p.description
|
22
|
-
= f.label :description, "Description"
|
23
|
-
= f.text_area 'description', :size => '40x6', :class => "textarea"
|
24
|
-
|
25
|
-
- @calendar.build_ical unless @calendar.ical
|
26
|
-
- form.edit_ical do
|
27
|
-
|
28
|
-
- f.fields_for :ical do |ical_f|
|
29
|
-
.ical
|
7
|
+
.main
|
8
|
+
- render_region :form do |form|
|
9
|
+
- form.edit_name do
|
10
|
+
.title
|
11
|
+
%p.title
|
12
|
+
= f.label :name
|
13
|
+
= f.text_field :name, :class => "textbox"
|
14
|
+
|
15
|
+
- form.edit_ical do
|
16
|
+
- f.fields_for :ical do |ical_f|
|
30
17
|
%p.url
|
31
18
|
= ical_f.label :url, "Subscription url (optional)"
|
32
19
|
= ical_f.text_field :url, :class => "textbox"
|
33
|
-
= ical_f.check_box :refresh_interval
|
34
|
-
= ical_f.label :refresh_interval, 'Refresh automatically?', :class => 'minor'
|
35
20
|
|
36
|
-
|
37
|
-
|
38
|
-
|
21
|
+
.drawer
|
22
|
+
.drawer_contents#subscription
|
23
|
+
|
24
|
+
%div.username
|
25
|
+
= ical_f.label :username, 'Username', :class => 'minor'
|
26
|
+
= ical_f.text_field :username, :class => "textbox"
|
39
27
|
|
40
|
-
|
41
|
-
|
42
|
-
|
28
|
+
%div.password
|
29
|
+
= ical_f.label :password, 'Password', :class => 'minor'
|
30
|
+
= ical_f.text_field :password, :class => "textbox"
|
43
31
|
|
44
|
-
|
45
|
-
|
32
|
+
%div.refreshment
|
33
|
+
= ical_f.check_box :refresh_interval
|
34
|
+
= ical_f.label :refresh_interval, 'Refresh automatically?', :class => 'minor'
|
35
|
+
|
36
|
+
.drawer_handle
|
37
|
+
%a.toggle{:href=>'#subscription', :rel=>"toggle[subscription]", :class=>"more"}
|
38
|
+
more
|
39
|
+
|
40
|
+
- form.edit_filing do
|
41
|
+
.filing
|
42
|
+
%p.calendar_category
|
43
|
+
= f.label :category
|
44
|
+
= f.text_field :category, :class => "textbox"
|
45
|
+
%p.calendar_slug
|
46
|
+
= f.label :slug
|
47
|
+
= f.text_field :slug, :class => "textbox"
|
48
|
+
|
49
|
+
- form.edit_description do
|
50
|
+
.description
|
51
|
+
%p.description
|
52
|
+
= f.label :description, "Description"
|
53
|
+
= f.text_area 'description', :size => '40x6', :class => "textarea"
|
46
54
|
|
47
55
|
- render_region :form_bottom do |form_bottom|
|
56
|
+
- form_bottom.edit_metadata do
|
57
|
+
.metadata
|
58
|
+
%p.keywords
|
59
|
+
= f.label :keywords
|
60
|
+
= f.text_field :keywords, :class => "textbox"
|
61
|
+
|
48
62
|
- form_bottom.edit_timestamp do
|
49
63
|
= updated_stamp @calendar
|
50
64
|
|
@@ -1,44 +1,48 @@
|
|
1
|
-
- include_stylesheet "admin/event_calendar"
|
2
|
-
- include_javascript "admin/event_calendar"
|
3
|
-
- if defined? TinyMceFilter
|
4
|
-
- include_javascript "tiny_mce/tiny_mce"
|
5
|
-
- include_javascript "tiny_mce/tiny_mce_settings"
|
6
|
-
- include_javascript "tiny_mce/application"
|
7
|
-
|
8
1
|
- or_choose ||= false
|
9
2
|
- event_venue ||= EventVenue.new
|
10
3
|
|
11
|
-
.
|
12
|
-
%p.
|
4
|
+
.main
|
5
|
+
%p.title
|
13
6
|
= f.label :title, "Venue or location title"
|
14
7
|
= f.text_field :title, :class => 'textbox'
|
15
8
|
- if or_choose && @venues.any?
|
16
9
|
= link_to "choose an existing place", '#', :class => 'swapper', :rel => 'toggle[venue,new_venue]'
|
17
|
-
|
18
|
-
%
|
10
|
+
- else
|
11
|
+
%span.note
|
12
|
+
We remember these details for you, so changes here affect every event occurring in this place
|
13
|
+
|
19
14
|
- if or_choose && @venues.any?
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
15
|
+
%p.note
|
16
|
+
If you've used this place before, please
|
17
|
+
= link_to "choose it from the list", '#', :class => 'swapper', :rel => 'toggle[venue,new_venue]'
|
18
|
+
so that you can update it globally
|
19
|
+
|
20
|
+
.metadata
|
21
|
+
%p.keywords
|
22
|
+
= f.label :keywords
|
23
|
+
= f.text_field :keywords, :class => "textbox"
|
24
|
+
|
25
|
+
.main
|
26
|
+
%p.location
|
27
|
+
= f.label :location, "Location tag"
|
28
|
+
= f.text_field :location, :class => "textbox"
|
29
|
+
%span.note
|
30
|
+
This is used to recognise the venue in a calendar feed. It can be postcode, grid reference or any distinctive string.
|
25
31
|
|
26
|
-
%p.
|
27
|
-
|
28
|
-
|
32
|
+
%p.address
|
33
|
+
- if defined? TinyMceFilter
|
34
|
+
= link_to image('mce', :alt=> 'toolbar icon'), '#', :class => 'toggleMCE', :rel => (@event ? "toggle[event_event_venue_attributes_address]" : "toggle[event_venue_address]")
|
35
|
+
= f.label :address, "Address or directions"
|
36
|
+
= f.text_area :address, :class => 'textarea'
|
29
37
|
|
30
|
-
|
31
|
-
|
32
|
-
|
38
|
+
.metadata
|
39
|
+
%p.venue_postcode
|
40
|
+
= f.label :postcode, "Postcode or grid reference"
|
41
|
+
= f.text_field :postcode, :class => 'textbox place'
|
42
|
+
%span.note
|
43
|
+
This is only required if your address is unusual or you want these events to show on a map in a particular place.
|
33
44
|
|
34
|
-
%p.
|
35
|
-
|
36
|
-
|
37
|
-
%span.note
|
38
|
-
This is only required if your address is unusual or you want these events to show on a map in a particular place.
|
45
|
+
%p.url
|
46
|
+
= f.label :url, "Venue url"
|
47
|
+
= f.text_field :url, :class => 'textbox'
|
39
48
|
|
40
|
-
%p.venue_description
|
41
|
-
- if defined? TinyMceFilter
|
42
|
-
= link_to image('mce', :alt=> 'toolbar icon'), '#', :class => 'toggleMCE', :rel => "toggle[event_venue_#{event_venue.id}_description]"
|
43
|
-
= f.label :description, "Description"
|
44
|
-
= f.text_area :description, :class => 'textarea', :id => "event_venue_#{event_venue.id}_description"
|
@@ -1,4 +1,9 @@
|
|
1
|
-
- include_stylesheet "admin/
|
1
|
+
- include_stylesheet "admin/event_calendar"
|
2
|
+
- include_javascript "admin/event_calendar"
|
3
|
+
- if defined? TinyMceFilter
|
4
|
+
- include_javascript "tiny_mce/tiny_mce"
|
5
|
+
- include_javascript "tiny_mce/tiny_mce_settings"
|
6
|
+
- include_javascript "tiny_mce/application"
|
2
7
|
|
3
8
|
- render_region :main do |main|
|
4
9
|
- main.edit_header do
|
@@ -1,4 +1,9 @@
|
|
1
|
-
- include_stylesheet "admin/
|
1
|
+
- include_stylesheet "admin/event_calendar"
|
2
|
+
- include_javascript "admin/event_calendar"
|
3
|
+
- if defined? TinyMceFilter
|
4
|
+
- include_javascript "tiny_mce/tiny_mce"
|
5
|
+
- include_javascript "tiny_mce/tiny_mce_settings"
|
6
|
+
- include_javascript "tiny_mce/application"
|
2
7
|
|
3
8
|
- render_region :main do |main|
|
4
9
|
- main.edit_header do
|
@@ -1,25 +1,19 @@
|
|
1
1
|
- master_event = event.occurrence? ? event.master : event
|
2
|
-
- cssclass = "node
|
2
|
+
- cssclass = "node"
|
3
3
|
- cssclass << " continuing" if event.continuing?
|
4
|
+
- cssclass << " past" if event.finished?
|
4
5
|
|
5
6
|
%tr{:class => cssclass}
|
6
7
|
- render_region :tbody do |tbody|
|
7
8
|
- tbody.date_cell do
|
8
9
|
%td.datemark
|
9
|
-
|
10
|
-
%a{:href => admin_event_url(master_event), :class => event.occurrence? ? 'occurrence' : 'master'}
|
11
|
-
%span.month= Date::ABBR_MONTHNAMES[event.start_date.month]
|
12
|
-
%span.day= event.start_date.mday
|
13
|
-
- else
|
10
|
+
%a{:href => admin_event_url(master_event), :class => event.occurrence? ? 'occurrence' : 'master'}
|
14
11
|
%span.month= Date::ABBR_MONTHNAMES[event.start_date.month]
|
15
12
|
%span.day= event.start_date.mday
|
16
13
|
- tbody.title_cell do
|
17
14
|
%td.event
|
18
15
|
%h3.title
|
19
|
-
|
20
|
-
= link_to event.title, edit_admin_event_url(master_event), :class => event.occurrence? ? 'occurrence' : 'master'
|
21
|
-
- else
|
22
|
-
= event.title
|
16
|
+
= link_to event.title, edit_admin_event_url(master_event), :class => event.occurrence? ? 'occurrence' : 'master'
|
23
17
|
%p.description
|
24
18
|
= truncate(event.description, 128)
|
25
19
|
- unless event.keywords.blank?
|
@@ -35,7 +29,8 @@
|
|
35
29
|
= event.summarize_period
|
36
30
|
- tbody.location_cell do
|
37
31
|
%td.location
|
38
|
-
|
32
|
+
- if event.event_venue
|
33
|
+
= event.event_venue.title
|
39
34
|
- tbody.modify_cell do
|
40
35
|
%td.remove
|
41
36
|
- if event.editable?
|