radiant-event_calendar-extension 1.1.0 → 1.1.1
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/README.md +0 -2
- data/VERSION +1 -1
- data/app/controllers/admin/events_controller.rb +12 -3
- data/app/controllers/admin/icals_controller.rb +2 -2
- data/app/models/calendar.rb +1 -1
- data/app/models/event.rb +13 -5
- data/app/models/ical.rb +15 -5
- data/app/views/admin/calendars/edit.html.haml +3 -0
- data/app/views/admin/calendars/index.html.haml +3 -0
- data/app/views/admin/calendars/new.html.haml +4 -1
- data/app/views/admin/event_venues/_event_venue.html.haml +4 -3
- data/app/views/admin/event_venues/_form.html.haml +1 -1
- data/app/views/admin/event_venues/edit.html.haml +3 -0
- data/app/views/admin/event_venues/index.html.haml +3 -0
- data/app/views/admin/event_venues/new.html.haml +4 -0
- data/app/views/admin/event_venues/remove.html.haml +30 -8
- data/app/views/admin/events/_event.html.haml +5 -13
- data/app/views/admin/events/_form.html.haml +3 -3
- data/app/views/admin/events/edit.html.haml +3 -0
- data/app/views/admin/events/index.html.haml +28 -2
- data/app/views/admin/events/new.html.haml +3 -0
- data/app/views/admin/events/remove.html.haml +11 -6
- data/app/views/events/_event.html.haml +2 -4
- data/config/routes.rb +2 -2
- data/event_calendar_extension.rb +1 -1
- data/pkg/radiant-event_calendar-extension-1.1.0.gem +0 -0
- data/public/stylesheets/sass/admin/event_calendar.sass +229 -216
- data/radiant-event_calendar-extension.gemspec +2 -4
- metadata +4 -6
- data/public/stylesheets/sass/admin/modules/_grid.sass +0 -56
- data/public/stylesheets/sass/constants.sass +0 -80
- data/public/stylesheets/sass/event_calendar.sass +0 -279
data/README.md
CHANGED
@@ -72,8 +72,6 @@ The events controller uses `share_layouts` to define various page parts that you
|
|
72
72
|
* `pagination` is the usual will_paginate block.
|
73
73
|
* `faceting` here only gives the option to remove any date filters that have been applied. If you add the `taggable_events` extension it gets more useful.
|
74
74
|
|
75
|
-
You will find minimal styling of some of these parts in `/stylesheets/sass/calendar.sass`,
|
76
|
-
|
77
75
|
Set the config entry `event_calendar.layout` to the name of your layout and point a browser at /calendar to see what you've got.
|
78
76
|
|
79
77
|
Here's a basic sample layout that should just work:
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.1.
|
1
|
+
1.1.1
|
@@ -1,15 +1,24 @@
|
|
1
1
|
class Admin::EventsController < Admin::ResourceController
|
2
2
|
paginate_models :per_page => 20
|
3
|
+
prepend_before_filter :get_venue
|
3
4
|
|
4
5
|
def load_models
|
5
6
|
pp = pagination_parameters
|
7
|
+
finder = @event_venue ? Event.at_venue(@event_venue) : Event.scoped
|
6
8
|
unless params[:p]
|
7
|
-
first_event =
|
8
|
-
i =
|
9
|
+
first_event = finder.future_and_current.first
|
10
|
+
i = finder.index(first_event) || 0 # if there are no future events we revert to the first page
|
9
11
|
p = (i / pp[:per_page].to_i) + 1
|
10
12
|
pp[:page] = p if p && p > 1
|
11
13
|
end
|
12
|
-
self.models =
|
14
|
+
self.models = finder.paginate(pp)
|
15
|
+
end
|
16
|
+
|
17
|
+
protected
|
18
|
+
|
19
|
+
def get_venue
|
20
|
+
@event_venue = EventVenue.find_by_id(params[:event_venue_id]) if params[:event_venue_id]
|
21
|
+
Rails.logger.warn "@event_venue is #{@event_venue.inspect}"
|
13
22
|
end
|
14
23
|
|
15
24
|
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
|
19
|
-
flash[:notice] = ical.calendar.name + " calendar refreshed
|
18
|
+
if response = ical.refresh
|
19
|
+
flash[:notice] = ical.calendar.name + " calendar refreshed. #{response}"
|
20
20
|
else
|
21
21
|
flash[:notice] = "Error parsing " + ical.calendar.name + " calendar from iCal subscription."
|
22
22
|
end
|
data/app/models/calendar.rb
CHANGED
data/app/models/event.rb
CHANGED
@@ -13,7 +13,7 @@ class Event < ActiveRecord::Base
|
|
13
13
|
|
14
14
|
belongs_to :master, :class_name => 'Event'
|
15
15
|
has_many :occurrences, :class_name => 'Event', :foreign_key => 'master_id', :dependent => :destroy
|
16
|
-
has_many :recurrence_rules, :class_name => 'EventRecurrenceRule', :dependent => :destroy, :conditions => {:active =>
|
16
|
+
has_many :recurrence_rules, :class_name => 'EventRecurrenceRule', :dependent => :destroy, :conditions => {:active => true}
|
17
17
|
accepts_nested_attributes_for :recurrence_rules, :allow_destroy => true, :reject_if => lambda { |attributes| attributes['active'].to_s != '1' }
|
18
18
|
|
19
19
|
validates_presence_of :uuid, :title, :start_date, :status_id
|
@@ -65,6 +65,14 @@ class Event < ActiveRecord::Base
|
|
65
65
|
|
66
66
|
named_scope :by_end_date, { :order => "end_date ASC" }
|
67
67
|
|
68
|
+
named_scope :at_venue, lambda { |venue| # EventVenue object
|
69
|
+
{ :conditions => ["event_venue_id = ?", venue.id] }
|
70
|
+
}
|
71
|
+
|
72
|
+
named_scope :except_these, lambda { |uuids| # array of uuid strings
|
73
|
+
{ :conditions => ["uuid not in (#{uuids.map{'?'}.join(',')})", *uuids] }
|
74
|
+
}
|
75
|
+
|
68
76
|
def self.in_the_last(period) # seconds. eg calendar.occurrences.in_the_last(1.week)
|
69
77
|
finish = Time.now
|
70
78
|
start = finish - period
|
@@ -183,6 +191,10 @@ class Event < ActiveRecord::Base
|
|
183
191
|
start_date.mday
|
184
192
|
end
|
185
193
|
|
194
|
+
def mday_padded
|
195
|
+
"%02d" % mday
|
196
|
+
end
|
197
|
+
|
186
198
|
def short_date
|
187
199
|
start_date.to_datetime.strftime(short_date_format)
|
188
200
|
end
|
@@ -418,8 +430,4 @@ protected
|
|
418
430
|
Radiant::Config['event_calendar.round_time_format'] || "%-1I%p"
|
419
431
|
end
|
420
432
|
|
421
|
-
def dates_are_in_order
|
422
|
-
|
423
|
-
end
|
424
|
-
|
425
433
|
end
|
data/app/models/ical.rb
CHANGED
@@ -5,6 +5,7 @@ require 'date'
|
|
5
5
|
require 'ftools'
|
6
6
|
|
7
7
|
class Ical < ActiveRecord::Base
|
8
|
+
include ActionView::Helpers::TextHelper
|
8
9
|
belongs_to :calendar
|
9
10
|
validates_presence_of :url
|
10
11
|
has_site if respond_to? :has_site
|
@@ -45,7 +46,8 @@ class Ical < ActiveRecord::Base
|
|
45
46
|
begin
|
46
47
|
Ical.transaction do
|
47
48
|
self.last_refresh_count = 0
|
48
|
-
|
49
|
+
count = { :created => 0, :updated => 0, :deleted => 0 }
|
50
|
+
uuids_seen = []
|
49
51
|
File.open(thisfile, "r") do |file|
|
50
52
|
components = RiCal.parse(file)
|
51
53
|
cal = components.first
|
@@ -53,22 +55,30 @@ class Ical < ActiveRecord::Base
|
|
53
55
|
if event = Event.find_by_uuid(cal_event.uid)
|
54
56
|
if cal_event.dtstamp > event.updated_at
|
55
57
|
affected.push event.update_from(cal_event)
|
58
|
+
count[:updated] += 1
|
56
59
|
else
|
57
60
|
end
|
58
|
-
event_count += 1
|
59
61
|
else
|
60
62
|
event = Event.create_from(cal_event)
|
61
63
|
event.site = self.calendar.site if event.respond_to? :site=
|
62
64
|
self.calendar.events << event
|
63
65
|
event.save!
|
64
|
-
|
66
|
+
count[:created] += 1
|
65
67
|
end
|
68
|
+
uuids_seen.push(cal_event.uid)
|
66
69
|
end
|
67
70
|
end
|
68
|
-
self.last_refresh_count =
|
71
|
+
self.last_refresh_count = uuids_seen.length
|
69
72
|
self.last_refresh_date = Time.now.utc
|
70
73
|
self.save!
|
71
|
-
|
74
|
+
|
75
|
+
self.calendar.events.except_these(uuids_seen).each do |event|
|
76
|
+
event.destroy
|
77
|
+
count[:deleted] += 1
|
78
|
+
end
|
79
|
+
response = [:created, :updated, :deleted].collect { |counter|
|
80
|
+
"#{pluralize(count[counter], 'event')} #{counter}. "
|
81
|
+
}.join('')
|
72
82
|
end
|
73
83
|
rescue => error
|
74
84
|
logger.error "RiCal parse error with: #{self.calendar.name}: #{error}."
|
@@ -5,7 +5,7 @@
|
|
5
5
|
%h3.title
|
6
6
|
= link_to event_venue.title, edit_admin_event_venue_url(event_venue)
|
7
7
|
%p.description
|
8
|
-
=
|
8
|
+
= link_to "#{event_venue.events.count} #{pluralize(event_venue.events.count, 'event')}", admin_event_venue_events_url(event_venue)
|
9
9
|
- tbody.location_cell do
|
10
10
|
%td.location
|
11
11
|
= event_venue.address
|
@@ -14,5 +14,6 @@
|
|
14
14
|
- if event_venue.url
|
15
15
|
= link_to truncate(event_venue.url, 48), event_venue.url
|
16
16
|
- tbody.modify_cell do
|
17
|
-
%td.
|
18
|
-
=
|
17
|
+
%td.actions
|
18
|
+
- confirmation = "Are you sure you want to delete entirely the event venue '#{event_venue.title}'?"
|
19
|
+
= link_to image('minus') + ' remove', remove_admin_event_venue_url(event_venue), :class => 'action'
|
@@ -1,5 +1,9 @@
|
|
1
|
+
- @page_title = 'Add a location'
|
2
|
+
- @page_title += ' - Calendar - ' + default_page_title
|
3
|
+
|
1
4
|
- include_stylesheet "admin/event_calendar"
|
2
5
|
- include_javascript "admin/event_calendar"
|
6
|
+
|
3
7
|
- if defined? TinyMceFilter
|
4
8
|
- include_javascript "tiny_mce/tiny_mce"
|
5
9
|
- include_javascript "tiny_mce/tiny_mce_settings"
|
@@ -1,17 +1,39 @@
|
|
1
|
-
|
1
|
+
- include_stylesheet "admin/event_calendar"
|
2
|
+
|
3
|
+
%h1 Remove location
|
2
4
|
|
3
5
|
%p
|
4
6
|
Are you sure you want to
|
5
7
|
%strong.warning
|
6
8
|
remove permanently
|
7
|
-
the
|
9
|
+
the location
|
10
|
+
= link_to @event_venue.title + '?', edit_admin_event_venue_url(@event_venue)
|
8
11
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
+
- if @event_venue.events.any?
|
13
|
+
%br
|
14
|
+
It is associated with
|
15
|
+
= @event_venue.events.count
|
16
|
+
= pluralize(@event_venue.events.count, 'event')
|
17
|
+
that will remain in the calendar without a location:
|
18
|
+
- else
|
19
|
+
It has no events.
|
12
20
|
|
13
|
-
-
|
21
|
+
- if @event_venue.events.any?
|
22
|
+
%ul
|
23
|
+
- @event_venue.events.each do |event|
|
24
|
+
%li
|
25
|
+
= link_to event.title, edit_admin_event_url(event)
|
26
|
+
%span.note
|
27
|
+
= event.summarize_start
|
28
|
+
|
29
|
+
- form_for [:admin, @event_venue], :html => {:method => :delete} do
|
14
30
|
%p.buttons
|
15
|
-
%input.button{:type=>"submit", :value=>"Delete
|
31
|
+
%input.button{:type=>"submit", :value=>"Delete location"}
|
16
32
|
or
|
17
|
-
= link_to 'Cancel',
|
33
|
+
= link_to 'Cancel', admin_event_venues_url
|
34
|
+
|
35
|
+
#actions
|
36
|
+
%ul
|
37
|
+
%li= link_to "event list", admin_events_url
|
38
|
+
%li= link_to "calendar list", admin_calendars_url
|
39
|
+
%li= link_to "venue list", admin_event_venues_url
|
@@ -9,18 +9,13 @@
|
|
9
9
|
%td.datemark
|
10
10
|
%a{:href => admin_event_url(master_event), :class => event.occurrence? ? 'occurrence' : 'master'}
|
11
11
|
%span.month= Date::ABBR_MONTHNAMES[event.start_date.month]
|
12
|
-
%span.day= event.
|
12
|
+
%span.day= event.mday_padded
|
13
13
|
- tbody.title_cell do
|
14
14
|
%td.event
|
15
15
|
%h3.title
|
16
16
|
= link_to event.title, edit_admin_event_url(master_event), :class => event.occurrence? ? 'occurrence' : 'master'
|
17
17
|
%p.description
|
18
|
-
= truncate(event.description, 128)
|
19
|
-
- unless event.keywords.blank?
|
20
|
-
%p.keywords
|
21
|
-
%strong
|
22
|
-
tags:
|
23
|
-
= event.keywords
|
18
|
+
= truncate(event.description, :length => 128)
|
24
19
|
- tbody.calendar_cell do
|
25
20
|
%td.calendar
|
26
21
|
= link_to event.calendar.name, admin_calendar_url(event.calendar) if event.calendar
|
@@ -30,13 +25,10 @@
|
|
30
25
|
- tbody.location_cell do
|
31
26
|
%td.location
|
32
27
|
- if event.event_venue
|
33
|
-
= event.event_venue.title
|
28
|
+
= link_to event.event_venue.title, edit_admin_event_venue_url(event.event_venue)
|
34
29
|
- tbody.modify_cell do
|
35
|
-
%td.
|
30
|
+
%td.actions
|
36
31
|
- if event.editable?
|
37
32
|
- confirmation = "Are you sure you want to delete entirely the event '#{event.title}'"
|
38
33
|
- confirmation << " and all its recurrences" if event.recurs?
|
39
|
-
= link_to
|
40
|
-
- else
|
41
|
-
%span.ineditable{:title => "subscribed events can't be removed here"}
|
42
|
-
remove
|
34
|
+
= link_to image('minus') + ' remove', remove_admin_event_url(event.master || event), :class => 'action'
|
@@ -86,7 +86,7 @@
|
|
86
86
|
|
87
87
|
- form_bottom.edit_venue do
|
88
88
|
- toggle_precedence = %w{venue new_venue}
|
89
|
-
- toggle_precedence.reverse! if @venues.empty?
|
89
|
+
- toggle_precedence.reverse! if @venues.empty?
|
90
90
|
|
91
91
|
- if imported
|
92
92
|
- f.fields_for :event_venue, @event.event_venue do |ef|
|
@@ -96,13 +96,13 @@
|
|
96
96
|
-if @venues.any?
|
97
97
|
#venue.main
|
98
98
|
%p#existing_venue
|
99
|
-
= f.label :event_venue_id, "Choose a
|
99
|
+
= f.label :event_venue_id, "Choose a location"
|
100
100
|
= f.select :event_venue_id, @venues.map {|v| [v.title, v.id]}, {:include_blank => true}, :class => 'textbox', :disabled => imported
|
101
101
|
- if imported
|
102
102
|
= link_to "edit this location", admin_event_venue_url(@event.event_venue)
|
103
103
|
to add title, description and directions
|
104
104
|
- else
|
105
|
-
= link_to "add a new
|
105
|
+
= link_to "add a new location", new_admin_event_venue_url, :class => 'swapper', :rel => "toggle[#{toggle_precedence.join(',')}]"
|
106
106
|
#new_venue
|
107
107
|
- @event.build_event_venue unless @event.event_venue
|
108
108
|
- f.fields_for :event_venue, @event.event_venue do |ef|
|
@@ -1,8 +1,34 @@
|
|
1
|
+
- @page_title = 'Events'
|
2
|
+
- @page_title += " at #{@event_venue.title}" if @event_venue
|
3
|
+
- @page_title += ' - Calendar - ' + default_page_title
|
4
|
+
|
1
5
|
- include_stylesheet "admin/event_calendar"
|
2
6
|
|
3
7
|
#events_table.outset
|
4
8
|
%table#events.index{:cellspacing=>"0", :border=>"0", :cellpadding=>"0"}
|
5
|
-
|
9
|
+
%thead
|
10
|
+
%tr
|
11
|
+
- render_region :thead do |thead|
|
12
|
+
- thead.date_header do
|
13
|
+
%th.date
|
14
|
+
- thead.title_header do
|
15
|
+
%th.event
|
16
|
+
%strong
|
17
|
+
Events
|
18
|
+
- if @event_venue
|
19
|
+
at
|
20
|
+
= @event_venue.title
|
21
|
+
= link_to "(show all)", admin_events_url
|
22
|
+
- thead.calendar_header do
|
23
|
+
%th.calendar Calendar
|
24
|
+
- thead.time_header do
|
25
|
+
%th.date Time
|
26
|
+
- thead.location_header do
|
27
|
+
%th.location Location
|
28
|
+
- thead.keywords_header do
|
29
|
+
%th.keywords Keywords
|
30
|
+
- thead.modify_header do
|
31
|
+
%th.modify Modify
|
6
32
|
|
7
33
|
%tbody
|
8
34
|
- if @events.any?
|
@@ -11,7 +37,7 @@
|
|
11
37
|
- else
|
12
38
|
%tr
|
13
39
|
%td.note{:colspan => admin.event.index.tbody.length}
|
14
|
-
No events
|
40
|
+
No events to display
|
15
41
|
|
16
42
|
- render_region :bottom do |bottom|
|
17
43
|
- bottom.buttons do
|
@@ -1,17 +1,22 @@
|
|
1
|
-
%h1
|
1
|
+
%h1 Delete event
|
2
2
|
|
3
3
|
%p
|
4
4
|
Are you sure you want to
|
5
5
|
%strong.warning
|
6
6
|
remove permanently
|
7
|
-
the
|
7
|
+
the event
|
8
|
+
= link_to(@event.title, edit_admin_event_url(@event)) + '?'
|
9
|
+
|
8
10
|
|
9
|
-
%table.index#events
|
10
|
-
%tbody
|
11
|
-
= render :partial => 'event', :object => @event
|
12
11
|
|
13
12
|
- form_for [:admin, @event], :html => {:method => :delete} do
|
14
13
|
%p.buttons
|
15
14
|
%input.button{:type=>"submit", :value=>"Delete event"}/
|
16
15
|
or
|
17
|
-
= link_to 'Cancel', admin_events_url
|
16
|
+
= link_to 'Cancel', admin_events_url
|
17
|
+
|
18
|
+
#actions
|
19
|
+
%ul
|
20
|
+
%li= link_to "event list", admin_events_url
|
21
|
+
%li= link_to "calendar list", admin_calendars_url
|
22
|
+
%li= link_to "venue list", admin_event_venues_url
|
@@ -10,16 +10,14 @@
|
|
10
10
|
- unless no_date
|
11
11
|
.datemark
|
12
12
|
.mon= event.short_month
|
13
|
-
.dom= event.
|
13
|
+
.dom= event.mday_padded
|
14
14
|
.summary
|
15
15
|
%h2
|
16
16
|
- if event.url
|
17
17
|
= link_to event.title, event.url, :class => 'title'
|
18
18
|
- else
|
19
19
|
= event.title
|
20
|
-
|
21
|
-
%span.tag
|
22
|
-
= tag.name
|
20
|
+
= event.keywords
|
23
21
|
|
24
22
|
%p.practicalities
|
25
23
|
= event.summarize_start
|
data/config/routes.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
ActionController::Routing::Routes.draw do |map|
|
2
2
|
map.namespace :admin, :path_prefix => '/admin/event_calendar' do |cal|
|
3
|
-
cal.resources :calendars
|
3
|
+
cal.resources :calendars, :member => {:remove => :get}
|
4
4
|
cal.resources :icals, :collection => {:refresh_all => :any}, :member => {:refresh => :put}
|
5
5
|
cal.resources :events, :member => {:remove => :get}
|
6
|
-
cal.resources :event_venues, :member => {:remove => :get}
|
6
|
+
cal.resources :event_venues, :member => {:remove => :get}, :has_many => :events
|
7
7
|
cal.calendars_home '/', :controller => 'events', :action => 'index'
|
8
8
|
end
|
9
9
|
map.calendar "/calendar.:format", :controller => 'events', :action => 'index'
|
data/event_calendar_extension.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
class EventCalendarExtension < Radiant::Extension
|
2
|
-
version "1.
|
2
|
+
version "1.1.1"
|
3
3
|
description "An event calendar extension that administers events locally or draws them from any ical or CalDAV publishers (Google Calendar, .Mac, Darwin Calendar Server, etc.)"
|
4
4
|
url "http://github.com/radiant/radiant-event_calendar-extension"
|
5
5
|
|
Binary file
|