calagator 0.0.1.pre1 → 1.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/{LICENSE.txt → MIT-LICENSE.txt} +0 -0
- data/README.md +4 -18
- data/Rakefile +6 -0
- data/app/assets/javascripts/calagator.js +1 -0
- data/app/assets/stylesheets/calagator/changes.scss +45 -0
- data/app/assets/stylesheets/calagator/errors.css +8 -0
- data/app/assets/stylesheets/calagator/forms.scss +148 -2
- data/app/assets/stylesheets/calagator/index.scss +21 -0
- data/app/assets/stylesheets/calagator/layout.scss +731 -0
- data/app/assets/stylesheets/calagator/mobile.scss +196 -0
- data/app/assets/stylesheets/calagator/{reset.css → reset.scss} +0 -0
- data/app/assets/stylesheets/calagator/typography.scss +225 -0
- data/app/assets/stylesheets/calagator/{common.scss → utils.scss} +0 -0
- data/app/assets/stylesheets/calagator/variables.scss +21 -0
- data/app/controllers/calagator/admin_controller.rb +1 -1
- data/app/controllers/calagator/application_controller.rb +3 -3
- data/app/controllers/calagator/events_controller.rb +3 -3
- data/app/controllers/calagator/site_controller.rb +1 -1
- data/app/controllers/calagator/sources_controller.rb +3 -3
- data/app/controllers/calagator/venues_controller.rb +4 -4
- data/app/controllers/calagator/versions_controller.rb +2 -2
- data/app/helpers/calagator/application_helper.rb +0 -3
- data/app/helpers/calagator/mapping_helper.rb +9 -8
- data/app/models/calagator/event.rb +2 -3
- data/app/models/calagator/event/ical_renderer.rb +4 -2
- data/app/models/calagator/event/saver.rb +2 -2
- data/app/models/calagator/event/search_engine/sql.rb +2 -1
- data/app/models/calagator/source.rb +0 -26
- data/app/models/calagator/source/importer.rb +1 -1
- data/app/models/calagator/source/parser/meetup.rb +2 -2
- data/app/models/calagator/venue.rb +0 -2
- data/app/models/calagator/venue/geocoder.rb +1 -1
- data/app/models/calagator/venue/search_engine/sql.rb +1 -1
- data/app/views/calagator/events/_subnav.html.erb +2 -2
- data/app/views/calagator/events/show.html.erb +2 -2
- data/app/views/calagator/site/_description.html.erb +6 -3
- data/app/views/calagator/site/_sidebar_menu.html.erb +13 -0
- data/app/views/calagator/site/index.html.erb +1 -0
- data/app/views/calagator/sources/index.html.erb +1 -1
- data/app/views/calagator/sources/show.html.erb +1 -1
- data/app/views/calagator/venues/_subnav.html.erb +1 -1
- data/app/views/calagator/venues/show.html.erb +1 -1
- data/app/views/layouts/calagator/_after_footer.html.erb +2 -0
- data/app/views/layouts/calagator/_content.html.erb +6 -0
- data/app/views/layouts/calagator/_footer.html.erb +8 -0
- data/app/views/layouts/calagator/_global_search.html.erb +11 -0
- data/app/views/layouts/calagator/_header.html.erb +20 -0
- data/app/views/layouts/calagator/application.html.erb +9 -64
- data/config/routes.rb +16 -16
- data/config/spring.rb +1 -0
- data/db/development +0 -0
- data/db/development.sqlite3 +0 -0
- data/db/migrate/20150407014752_add_taggings_counter_cache_to_tags.acts_as_taggable_on_engine.rb +14 -0
- data/db/migrate/20150407014754_change_collation_for_tag_names.acts_as_taggable_on_engine.rb +9 -0
- data/db/schema.rb +2 -8
- data/db/seeds.rb +64 -8
- data/lib/calagator.rb +42 -2
- data/lib/calagator/duplicate_checking/duplicate_finder.rb +1 -1
- data/lib/calagator/duplicate_checking/duplicate_squasher.rb +1 -1
- data/lib/calagator/engine.rb +12 -22
- data/lib/calagator/tag_model_extensions.rb +1 -1
- data/lib/calagator/version.rb +1 -1
- data/lib/generators/calagator/install_generator.rb +17 -12
- data/lib/generators/calagator/templates/config/initializers/01_calagator.rb +89 -0
- data/lib/generators/calagator/templates/config/initializers/02_geokit.rb +106 -0
- data/lib/tasks/sunspot_reindex_calagator.rake +16 -3
- data/lib/tasks/update_counter_caches.rake +3 -3
- data/spec/controllers/calagator/events_controller_spec.rb +3 -3
- data/spec/controllers/calagator/sources_controller_spec.rb +3 -3
- data/spec/controllers/calagator/venues_controller_spec.rb +5 -5
- data/spec/dummy/Gemfile +35 -27
- data/spec/dummy/README.rdoc +15 -248
- data/spec/dummy/Rakefile +1 -2
- data/spec/dummy/app/assets/javascripts/application.js +5 -4
- data/spec/dummy/app/assets/stylesheets/application.css +6 -4
- data/spec/dummy/app/controllers/application_controller.rb +3 -1
- data/spec/dummy/app/views/layouts/application.html.erb +2 -2
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +29 -0
- data/spec/dummy/config.ru +2 -2
- data/spec/dummy/config/application.rb +5 -41
- data/spec/dummy/config/boot.rb +1 -4
- data/spec/dummy/config/database.yml +8 -8
- data/spec/dummy/config/environment.rb +3 -3
- data/spec/dummy/config/environments/development.rb +22 -18
- data/spec/dummy/config/environments/production.rb +46 -34
- data/spec/dummy/config/environments/test.rb +19 -14
- data/spec/dummy/config/initializers/01_calagator.rb +89 -0
- data/spec/dummy/config/initializers/02_geokit.rb +106 -0
- data/spec/dummy/config/initializers/assets.rb +11 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +6 -5
- data/spec/dummy/config/initializers/mime_types.rb +0 -1
- data/spec/dummy/config/initializers/session_store.rb +1 -6
- data/spec/dummy/config/initializers/wrap_parameters.rb +6 -6
- data/spec/dummy/config/locales/en.yml +20 -2
- data/spec/dummy/config/routes.rb +23 -25
- data/spec/dummy/config/secrets.yml +16 -77
- data/spec/dummy/config/sunspot.yml +23 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/schema.rb +31 -30
- data/spec/dummy/db/seeds.rb +1 -0
- data/spec/dummy/log/development.log +257 -235
- data/spec/dummy/public/404.html +54 -13
- data/spec/dummy/public/422.html +54 -13
- data/spec/dummy/public/500.html +53 -12
- data/spec/dummy/public/robots.txt +2 -2
- data/spec/dummy/test/test_helper.rb +2 -5
- data/spec/factories.rb +0 -54
- data/spec/features/admin_auth_spec.rb +2 -2
- data/spec/features/admin_lock_event_spec.rb +1 -1
- data/spec/features/import_events_from_feed_spec.rb +1 -1
- data/spec/helpers/calagator/google_event_export_helper_spec.rb +8 -11
- data/spec/helpers/calagator/sources_helper_spec.rb +1 -2
- data/spec/helpers/calagator/tags_helper_spec.rb +1 -2
- data/spec/models/calagator/event_spec.rb +7 -7
- data/spec/models/calagator/source/parser_meetup_spec.rb +3 -3
- data/spec/models/calagator/source_spec.rb +0 -29
- data/spec/models/calagator/venue_spec.rb +8 -11
- data/spec/spec_helper.rb +3 -1
- data/spec/support/admin_authentication.rb +2 -0
- data/spec/support/assert_dom_equal.rb +26 -0
- data/spec/support/paper_trail.rb +7 -0
- data/spec/support/rspec-activemodel-mocks_patch.rb +9 -0
- metadata +200 -280
- data/app/assets/stylesheets/calagator.scss +0 -8
- data/app/assets/stylesheets/calagator/datepicker.scss +0 -177
- data/app/assets/stylesheets/calagator/theme.css +0 -0
- data/app/models/event/search_engine/base.rb +0 -0
- data/config/deploy/local.rb +0 -37
- data/config/deploy/lucca.rb +0 -33
- data/config/initializers/geokit.rb +0 -74
- data/config/initializers/search_engine.rb +0 -4
- data/config/initializers/set_default_url_host.rb +0 -5
- data/db/test.sqlite3 +0 -0
- data/lib/generators/calagator/templates/config/calagator.rb +0 -26
- data/lib/generators/calagator/templates/config/secrets.yml.sample +0 -83
- data/lib/secrets_reader.rb +0 -76
- data/spec/dummy/Gemfile.lock +0 -195
- data/spec/dummy/app/assets/images/rails.png +0 -0
- data/spec/dummy/config/initializers/calagator.rb +0 -26
- data/spec/dummy/config/initializers/secret_token.rb +0 -7
- data/spec/dummy/db/migrate/20150309023304_create_events.calagator.rb +0 -18
- data/spec/dummy/db/migrate/20150309023305_create_venues.calagator.rb +0 -18
- data/spec/dummy/db/migrate/20150309023306_create_sources.calagator.rb +0 -17
- data/spec/dummy/db/migrate/20150309023307_add_detailed_fields_to_venue.calagator.rb +0 -20
- data/spec/dummy/db/migrate/20150309023308_add_end_time_to_events.calagator.rb +0 -10
- data/spec/dummy/db/migrate/20150309023309_add_source_id_to_events.calagator.rb +0 -10
- data/spec/dummy/db/migrate/20150309023310_add_source_id_to_venues.calagator.rb +0 -11
- data/spec/dummy/db/migrate/20150309023311_add_duplicate_of_column_to_venues.calagator.rb +0 -10
- data/spec/dummy/db/migrate/20150309023312_add_duplicate_of_column_to_events.calagator.rb +0 -10
- data/spec/dummy/db/migrate/20150309023313_change_lat_long_type.calagator.rb +0 -13
- data/spec/dummy/db/migrate/20150309023314_add_source_reimport.calagator.rb +0 -10
- data/spec/dummy/db/migrate/20150309023315_change_end_time_to_duration.calagator.rb +0 -12
- data/spec/dummy/db/migrate/20150309023316_remove_format_type_from_source.calagator.rb +0 -10
- data/spec/dummy/db/migrate/20150309023317_create_updates.calagator.rb +0 -16
- data/spec/dummy/db/migrate/20150309023318_remove_next_update_from_source.calagator.rb +0 -10
- data/spec/dummy/db/migrate/20150309023319_change_duration_to_end_time.calagator.rb +0 -12
- data/spec/dummy/db/migrate/20150309023320_create_tags_and_taggings.calagator.rb +0 -29
- data/spec/dummy/db/migrate/20150309023321_create_versioned_events.calagator.rb +0 -26
- data/spec/dummy/db/migrate/20150309023322_create_versioned_venues.calagator.rb +0 -33
- data/spec/dummy/db/migrate/20150309023323_add_rrule_to_events.calagator.rb +0 -16
- data/spec/dummy/db/migrate/20150309023324_create_versions.calagator.rb +0 -19
- data/spec/dummy/db/migrate/20150309023325_add_closed_flag_to_venues.calagator.rb +0 -10
- data/spec/dummy/db/migrate/20150309023326_add_wifi_flag_to_venues.calagator.rb +0 -10
- data/spec/dummy/db/migrate/20150309023327_add_access_notes_to_venues.calagator.rb +0 -10
- data/spec/dummy/db/migrate/20150309023328_add_events_count_to_venues.calagator.rb +0 -9
- data/spec/dummy/db/migrate/20150309023329_add_venue_details_to_events.calagator.rb +0 -10
- data/spec/dummy/db/migrate/20150309023330_acts_as_taggable_on_migration.calagator.rb +0 -51
- data/spec/dummy/db/migrate/20150309023331_cleanup.calagator.rb +0 -15
- data/spec/dummy/db/migrate/20150309023332_specify_venues_latitude_and_longitude_precision.calagator.rb +0 -12
- data/spec/dummy/db/migrate/20150309023333_remove_updates.calagator.rb +0 -14
- data/spec/dummy/db/migrate/20150309023334_add_locked_status_to_events.calagator.rb +0 -6
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/doc/README_FOR_APP +0 -2
- data/spec/dummy/script/rails +0 -6
- data/spec/dummy/test/performance/browsing_test.rb +0 -12
- data/spec/lib/secrets_reader_spec.rb +0 -65
@@ -26,9 +26,9 @@ protected
|
|
26
26
|
def self.require_admin(options = {})
|
27
27
|
http_basic_authenticate_with(
|
28
28
|
options.reverse_merge(
|
29
|
-
:name =>
|
30
|
-
:password =>
|
31
|
-
:if => Proc.new {
|
29
|
+
:name => Calagator.admin_username,
|
30
|
+
:password => Calagator.admin_password,
|
31
|
+
:if => Proc.new { Calagator.admin_username && Calagator.admin_password }
|
32
32
|
)
|
33
33
|
)
|
34
34
|
end
|
@@ -2,7 +2,7 @@ require "calagator/duplicate_checking/controller_actions"
|
|
2
2
|
|
3
3
|
module Calagator
|
4
4
|
|
5
|
-
class EventsController < ApplicationController
|
5
|
+
class EventsController < Calagator::ApplicationController
|
6
6
|
# Provides #duplicates and #squash_many_duplicates
|
7
7
|
include DuplicateChecking::ControllerActions
|
8
8
|
require_admin only: [:duplicates, :squash_many_duplicates]
|
@@ -39,7 +39,7 @@ class EventsController < ApplicationController
|
|
39
39
|
# GET /events/new
|
40
40
|
# GET /events/new.xml
|
41
41
|
def new
|
42
|
-
@event = Event.new(params[:event])
|
42
|
+
@event = Event.new(params.permit![:event])
|
43
43
|
end
|
44
44
|
|
45
45
|
# GET /events/1/edit
|
@@ -60,7 +60,7 @@ class EventsController < ApplicationController
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def create_or_update
|
63
|
-
saver = Event::Saver.new(@event, params)
|
63
|
+
saver = Event::Saver.new(@event, params.permit!)
|
64
64
|
respond_to do |format|
|
65
65
|
if saver.save
|
66
66
|
format.html {
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module Calagator
|
2
2
|
|
3
|
-
class SourcesController < ApplicationController
|
3
|
+
class SourcesController < Calagator::ApplicationController
|
4
4
|
# POST /import
|
5
5
|
# POST /import.xml
|
6
6
|
def import
|
7
|
-
@importer = Source::Importer.new(params[:source])
|
7
|
+
@importer = Source::Importer.new(params.permit![:source])
|
8
8
|
respond_to do |format|
|
9
9
|
if @importer.import
|
10
10
|
format.html { redirect_to events_path, flash: { success: render_to_string(layout: false) } }
|
@@ -67,7 +67,7 @@ class SourcesController < ApplicationController
|
|
67
67
|
|
68
68
|
def create_or_update
|
69
69
|
respond_to do |format|
|
70
|
-
if @source.update_attributes(params[:source])
|
70
|
+
if @source.update_attributes(params.permit![:source])
|
71
71
|
format.html { redirect_to @source, notice: 'Source was successfully saved.' }
|
72
72
|
format.xml { render xml: @source, status: :created, location: @source }
|
73
73
|
else
|
@@ -2,7 +2,7 @@ require "calagator/duplicate_checking/controller_actions"
|
|
2
2
|
|
3
3
|
module Calagator
|
4
4
|
|
5
|
-
class VenuesController < ApplicationController
|
5
|
+
class VenuesController < Calagator::ApplicationController
|
6
6
|
# Provides #duplicates and #squash_many_duplicates
|
7
7
|
include DuplicateChecking::ControllerActions
|
8
8
|
require_admin only: [:duplicates, :squash_many_duplicates]
|
@@ -10,7 +10,7 @@ class VenuesController < ApplicationController
|
|
10
10
|
# GET /venues
|
11
11
|
# GET /venues.xml
|
12
12
|
def index
|
13
|
-
@search = Venue::Search.new(params)
|
13
|
+
@search = Venue::Search.new(params.permit!)
|
14
14
|
@venues = @search.venues
|
15
15
|
|
16
16
|
respond_to do |format|
|
@@ -42,7 +42,7 @@ class VenuesController < ApplicationController
|
|
42
42
|
# GET /venues/1
|
43
43
|
# GET /venues/1.xml
|
44
44
|
def show
|
45
|
-
@venue = Venue.find(params[:id]
|
45
|
+
@venue = Venue.find(params[:id])
|
46
46
|
|
47
47
|
return redirect_to @venue.duplicate_of if @venue.duplicate?
|
48
48
|
|
@@ -85,7 +85,7 @@ class VenuesController < ApplicationController
|
|
85
85
|
end
|
86
86
|
|
87
87
|
def create_or_update
|
88
|
-
@venue.attributes = params[:venue]
|
88
|
+
@venue.attributes = params.permit![:venue] || {}
|
89
89
|
respond_to do |format|
|
90
90
|
if !evil_robot? && @venue.save
|
91
91
|
format.html { redirect_to from_event || @venue, flash: { success: "Venue was successfully saved." } }
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module Calagator
|
2
2
|
|
3
|
-
class VersionsController < ApplicationController
|
3
|
+
class VersionsController < Calagator::ApplicationController
|
4
4
|
def edit
|
5
|
-
@version = Version.find(params[:id])
|
5
|
+
@version = PaperTrail::Version.find(params[:id])
|
6
6
|
@record = @version.next.try(:reify) || @version.item || @version.reify
|
7
7
|
|
8
8
|
singular = @record.class.name.singularize.underscore.split("/").last
|
@@ -116,9 +116,6 @@ module ApplicationHelper
|
|
116
116
|
].compact.join(" ")
|
117
117
|
end
|
118
118
|
|
119
|
-
# String name of the mobile preference cookie's name, e.g. "calagator_mobile".
|
120
|
-
MOBILE_COOKIE_NAME = "#{SECRETS.session_name}_mobile"
|
121
|
-
|
122
119
|
# CGI escape a string-like object. The issue is that CGI::escape fails if used on a RailsXss SafeBuffer: https://github.com/rails/rails_xss/issues/8
|
123
120
|
def cgi_escape(data)
|
124
121
|
return CGI::escape(data.to_str)
|
@@ -2,15 +2,15 @@ module Calagator
|
|
2
2
|
|
3
3
|
module MappingHelper
|
4
4
|
def map_provider
|
5
|
-
|
5
|
+
Calagator.mapping_provider || 'stamen'
|
6
6
|
end
|
7
7
|
|
8
8
|
def map_tiles
|
9
|
-
|
9
|
+
Calagator.mapping_tiles || 'terrain'
|
10
10
|
end
|
11
11
|
|
12
12
|
def leaflet_js
|
13
|
-
Rails.env.production? ? ["
|
13
|
+
Rails.env.production? ? ["http://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.3/leaflet.js"] : ["leaflet"]
|
14
14
|
end
|
15
15
|
|
16
16
|
def map_provider_dependencies
|
@@ -19,10 +19,10 @@ module MappingHelper
|
|
19
19
|
"mapbox" => ["https://api.tiles.mapbox.com/mapbox.js/v1.3.1/mapbox.standalone.js"],
|
20
20
|
"esri" => ["http://cdn-geoweb.s3.amazonaws.com/esri-leaflet/0.0.1-beta.5/esri-leaflet.js"],
|
21
21
|
"google" => [
|
22
|
-
"https://maps.googleapis.com/maps/api/js?key=#{
|
23
|
-
"leaflet_google_layer"
|
24
|
-
]
|
25
|
-
}[map_provider]
|
22
|
+
"https://maps.googleapis.com/maps/api/js?key=#{Calagator.mapping_google_maps_api_key}&sensor=false",
|
23
|
+
"leaflet_google_layer"
|
24
|
+
]
|
25
|
+
}[map_provider] || []
|
26
26
|
end
|
27
27
|
|
28
28
|
def mapping_js_includes
|
@@ -58,7 +58,8 @@ module MappingHelper
|
|
58
58
|
|
59
59
|
var venueIcon = L.AwesomeMarkers.icon({
|
60
60
|
icon: 'star',
|
61
|
-
|
61
|
+
prefix: 'fa',
|
62
|
+
markerColor: '#{Calagator.mapping_marker_color}'
|
62
63
|
})
|
63
64
|
|
64
65
|
var markers = [#{markers.join(", ")}];
|
@@ -36,8 +36,6 @@ module Calagator
|
|
36
36
|
class Event < ActiveRecord::Base
|
37
37
|
self.table_name = "events"
|
38
38
|
|
39
|
-
attr_protected
|
40
|
-
|
41
39
|
has_paper_trail
|
42
40
|
acts_as_taggable
|
43
41
|
|
@@ -100,7 +98,7 @@ class Event < ActiveRecord::Base
|
|
100
98
|
when 'name'
|
101
99
|
order('lower(events.title), start_time')
|
102
100
|
when 'venue'
|
103
|
-
includes(:venue).order('lower(venues.title), start_time')
|
101
|
+
includes(:venue).order('lower(venues.title), start_time').references(:venues)
|
104
102
|
else # when 'date', nil
|
105
103
|
order('start_time')
|
106
104
|
end
|
@@ -144,6 +142,7 @@ class Event < ActiveRecord::Base
|
|
144
142
|
|
145
143
|
def time_for(value)
|
146
144
|
value = value.join(' ') if value.kind_of?(Array)
|
145
|
+
value = value.to_s if value.kind_of?(Date)
|
147
146
|
value = Time.zone.parse(value) if value.kind_of?(String) # this will throw ArgumentError if invalid
|
148
147
|
value
|
149
148
|
end
|
@@ -10,6 +10,8 @@
|
|
10
10
|
# Example:
|
11
11
|
# ics1 = Event::IcalRenderer.render(myevent)
|
12
12
|
# ics2 = Event::IcalRenderer.render(myevents, url_helper: -> (event) { event_url(event) })
|
13
|
+
require "loofah/helpers"
|
14
|
+
|
13
15
|
module Calagator
|
14
16
|
|
15
17
|
class Event < ActiveRecord::Base
|
@@ -128,10 +130,10 @@ class Event < ActiveRecord::Base
|
|
128
130
|
def sequence
|
129
131
|
# Set the iCalendar SEQUENCE, which should be increased each time an
|
130
132
|
# event is updated. If an admin needs to forcefully increment the
|
131
|
-
# SEQUENCE for all events, they can edit the "config/
|
133
|
+
# SEQUENCE for all events, they can edit the "config/initializers/calagator.rb"
|
132
134
|
# file and set the "icalendar_sequence_offset" value to something
|
133
135
|
# greater than 0.
|
134
|
-
(
|
136
|
+
(Calagator.icalendar_sequence_offset || 0) + event.versions.count
|
135
137
|
end
|
136
138
|
|
137
139
|
def dtstamp
|
@@ -3,7 +3,7 @@ module Calagator
|
|
3
3
|
class Event < ActiveRecord::Base
|
4
4
|
class Saver < Struct.new(:event, :params, :failure)
|
5
5
|
def save
|
6
|
-
event.attributes = params[:event]
|
6
|
+
event.attributes = params[:event] || {}
|
7
7
|
event.venue = find_or_initialize_venue
|
8
8
|
event.start_time = [ params[:start_date], params[:start_time] ]
|
9
9
|
event.end_time = [ params[:end_date], params[:end_time] ]
|
@@ -23,7 +23,7 @@ class Event < ActiveRecord::Base
|
|
23
23
|
if params[:event] && params[:event][:venue_id].present?
|
24
24
|
Venue.find(params[:event][:venue_id]).progenitor
|
25
25
|
else
|
26
|
-
Venue.
|
26
|
+
Venue.find_or_initialize_by(title: params[:venue_name]).progenitor
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -50,11 +50,12 @@ class Event < ActiveRecord::Base
|
|
50
50
|
def base
|
51
51
|
column_names = Event.column_names.map { |name| "events.#{name}"}
|
52
52
|
column_names << "venues.id"
|
53
|
-
@scope = Event.
|
53
|
+
@scope = Event.all
|
54
54
|
.group(column_names)
|
55
55
|
.joins("LEFT OUTER JOIN taggings on taggings.taggable_id = events.id AND taggings.taggable_type LIKE '%Event'")
|
56
56
|
.joins("LEFT OUTER JOIN tags ON tags.id = taggings.tag_id")
|
57
57
|
.includes(:venue)
|
58
|
+
.references(:venues, :tags)
|
58
59
|
self
|
59
60
|
end
|
60
61
|
|
@@ -25,8 +25,6 @@ module Calagator
|
|
25
25
|
class Source < ActiveRecord::Base
|
26
26
|
self.table_name = "sources"
|
27
27
|
|
28
|
-
attr_protected
|
29
|
-
|
30
28
|
validate :assert_url
|
31
29
|
|
32
30
|
has_many :events, :dependent => :destroy
|
@@ -39,30 +37,6 @@ class Source < ActiveRecord::Base
|
|
39
37
|
xss_foliate
|
40
38
|
include DecodeHtmlEntitiesHack
|
41
39
|
|
42
|
-
# Return a newly-created or existing Source record matching the given
|
43
|
-
# attributes. The +attrs+ hash is the same format as used when calling
|
44
|
-
# Source::new.
|
45
|
-
#
|
46
|
-
# This method is intended to supplement the import process by providing a
|
47
|
-
# single Source record for each unique URL, thus when multiple people import
|
48
|
-
# the same URL, there will only be one Source record.
|
49
|
-
#
|
50
|
-
# The :reimport flag is given special handling: If the original Source record
|
51
|
-
# has this set to true, it will never be set back to false by this method.
|
52
|
-
# The intent behind this is that if one person wants this Source reimported,
|
53
|
-
# the reimporting shouldn't be disabled by someone else manually importing it
|
54
|
-
# without setting the reimport flag. If someone really wants to turn off
|
55
|
-
# reimporting, they should edit the source.
|
56
|
-
def self.find_or_create_from(attrs={})
|
57
|
-
return new(attrs) unless attrs[:url]
|
58
|
-
|
59
|
-
source = find_or_create_by_url(attrs[:url])
|
60
|
-
source.reimport = true if attrs.delete(:reimport)
|
61
|
-
source.attributes = attrs
|
62
|
-
source.save if source.changed?
|
63
|
-
source
|
64
|
-
end
|
65
|
-
|
66
40
|
# Create events for this source. Returns the events created. URL must be set
|
67
41
|
# for this source for this to work.
|
68
42
|
def create_events!(opts={})
|
@@ -5,7 +5,7 @@ class Source::Parser::Meetup < Source::Parser
|
|
5
5
|
self.url_pattern = %r{^http://(?:www\.)?meetup\.com/[^/]+/events/([^/]+)/?}
|
6
6
|
|
7
7
|
def to_events
|
8
|
-
return fallback unless
|
8
|
+
return fallback unless Calagator.meetup_api_key.present?
|
9
9
|
return unless data = get_data
|
10
10
|
event = Event.new({
|
11
11
|
source: opts[:source],
|
@@ -36,7 +36,7 @@ class Source::Parser::Meetup < Source::Parser
|
|
36
36
|
[
|
37
37
|
"https://api.meetup.com/2/event/#{event_id}",
|
38
38
|
{
|
39
|
-
key:
|
39
|
+
key: Calagator.meetup_api_key,
|
40
40
|
sign: 'true'
|
41
41
|
}
|
42
42
|
]
|
@@ -14,7 +14,7 @@ class Venue < ActiveRecord::Base
|
|
14
14
|
def geocode
|
15
15
|
return true unless should_geocode?
|
16
16
|
|
17
|
-
self.geo =
|
17
|
+
self.geo = Geokit::Geocoders::MultiGeocoder.geocode(venue.geocode_address)
|
18
18
|
if geo.success
|
19
19
|
venue.latitude = geo.lat
|
20
20
|
venue.longitude = geo.lng
|
@@ -17,7 +17,7 @@ class Venue < ActiveRecord::Base
|
|
17
17
|
|
18
18
|
def base
|
19
19
|
column_names = Venue.column_names.map { |name| "venues.#{name}" }
|
20
|
-
@scope = Venue.
|
20
|
+
@scope = Venue.all
|
21
21
|
.group(column_names)
|
22
22
|
.joins("LEFT OUTER JOIN taggings on taggings.taggable_id = venues.id AND taggings.taggable_type LIKE '%Venue'")
|
23
23
|
.joins("LEFT OUTER JOIN tags ON tags.id = taggings.tag_id")
|
@@ -1,12 +1,12 @@
|
|
1
1
|
<div id="events_subnav" class="subnav">
|
2
2
|
<ul class="clearfix">
|
3
|
-
<li><%= link_to 'Browse
|
3
|
+
<li><%= link_to 'Browse events', root_url,
|
4
4
|
:class => subnav_class_for("site", "index") %>
|
5
5
|
</li>
|
6
6
|
<li><%= link_to 'Add an event', new_event_url,
|
7
7
|
:class => subnav_class_for("events", "new") %>
|
8
8
|
</li>
|
9
|
-
<li><%= link_to 'Import
|
9
|
+
<li><%= link_to 'Import events', new_source_url,
|
10
10
|
:class => subnav_class_for("sources", "new") %>
|
11
11
|
</li>
|
12
12
|
</ul>
|
@@ -43,7 +43,7 @@
|
|
43
43
|
<li><%= link_to "Google Calendar", google_event_export_link(@event), :id => "google_calendar_export", :target => "_blank" %></li>
|
44
44
|
<li><%= link_to 'iCalendar file', "#{event_url(@event)}.ics" %></li>
|
45
45
|
<li>
|
46
|
-
|
46
|
+
<a href="#" onclick="$('#hcal_field').toggle(); return false">hCalendar markup</a>
|
47
47
|
<div id="hcal_field" style="display: none;">
|
48
48
|
<%= text_area_tag 'hCalendar',
|
49
49
|
h(
|
@@ -67,7 +67,7 @@
|
|
67
67
|
<%= link_to "edit", edit_event_url(@event) %>,
|
68
68
|
<%= link_to "clone", clone_event_url(@event) %>,
|
69
69
|
or
|
70
|
-
<%= link_to "delete", event_url(@event), :
|
70
|
+
<%= link_to "delete", event_url(@event), method: :delete, data: { confirm: "Are you sure?" } %>
|
71
71
|
this event.
|
72
72
|
</p>
|
73
73
|
<% end %>
|
@@ -1,3 +1,6 @@
|
|
1
|
-
<
|
2
|
-
|
3
|
-
|
1
|
+
<div class='replace-this-text'>
|
2
|
+
<h2>Hi there.</h2>
|
3
|
+
<p>
|
4
|
+
Describe your site in: <code>app/views/calagator/site/_description.html.erb</code>
|
5
|
+
</p>
|
6
|
+
</div>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<h4>Get Started</h4>
|
2
|
+
<ul>
|
3
|
+
<li><%= link_to "Find local events", about_url(anchor: "find_local_events") %></li>
|
4
|
+
<li><%= link_to "Share local events", about_url(anchor: "share_local_events") %></li>
|
5
|
+
<li><%= link_to "Get involved", about_url(anchor: "get_involved") %></li>
|
6
|
+
<li><%= link_to "Find out about us", about_url %></li>
|
7
|
+
</ul>
|
8
|
+
|
9
|
+
<h4>Subscribe To</h4>
|
10
|
+
<ul>
|
11
|
+
<li><%= link_to "iCalendar feed", icalendar_feed_link %></li>
|
12
|
+
<li><%= link_to "Atom feed", atom_feed_link %></li>
|
13
|
+
</ul>
|
@@ -10,7 +10,7 @@
|
|
10
10
|
<tr class="<%= cycle 'odd', 'even' %>">
|
11
11
|
<td>
|
12
12
|
<%= link_to 'Show', source %> |
|
13
|
-
<%= link_to 'Destroy', source, :confirm
|
13
|
+
<%= link_to 'Destroy', source, method: :delete, data: {confirm: 'Are you sure?' } %>
|
14
14
|
</td>
|
15
15
|
<td><%= source_url_link source %></td>
|
16
16
|
</tr>
|