open_conference_ware 1.0.0.pre3 → 1.0.0.pre4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. data.tar.gz.sig +0 -0
  2. data/.travis.yml +6 -0
  3. data/CHANGES.md +13 -0
  4. data/app/assets/javascripts/open_conference_ware/application.js +2 -0
  5. data/app/assets/javascripts/open_conference_ware/proposals.js +8 -12
  6. data/app/assets/stylesheets/open_conference_ware/application.css +1 -0
  7. data/app/controllers/open_conference_ware/application_controller.rb +8 -6
  8. data/app/controllers/open_conference_ware/authentications_controller.rb +1 -1
  9. data/app/controllers/open_conference_ware/events_controller.rb +5 -1
  10. data/app/controllers/open_conference_ware/proposals_controller.rb +9 -8
  11. data/app/controllers/open_conference_ware/session_types_controller.rb +2 -2
  12. data/app/mixins/open_conference_ware/public_attributes_mixin.rb +1 -1
  13. data/app/models/open_conference_ware/event.rb +7 -4
  14. data/app/models/open_conference_ware/room.rb +4 -0
  15. data/app/models/open_conference_ware/track.rb +3 -0
  16. data/app/models/open_conference_ware/user.rb +20 -10
  17. data/app/views/layouts/open_conference_ware/_header.html.erb +3 -0
  18. data/app/views/layouts/open_conference_ware/application.html.erb +1 -22
  19. data/app/views/open_conference_ware/authentications/_openid.html.erb +24 -10
  20. data/app/views/open_conference_ware/proposals/_admin_controls.html.erb +1 -1
  21. data/app/views/open_conference_ware/proposals/_form.html.erb +2 -2
  22. data/app/views/open_conference_ware/proposals/_list_concise.html.erb +2 -2
  23. data/app/views/open_conference_ware/proposals/_selector_voting.html.erb +52 -0
  24. data/app/views/open_conference_ware/proposals/_sub_list.html.erb +1 -1
  25. data/app/views/open_conference_ware/proposals/_sub_list_for_kind.html.erb +1 -1
  26. data/app/views/open_conference_ware/proposals/create.html.erb +2 -25
  27. data/app/views/open_conference_ware/proposals/show.html.erb +1 -53
  28. data/app/views/open_conference_ware/proposals/stats.html.erb +1 -1
  29. data/app/views/open_conference_ware/selector_votes/index.html.erb +3 -1
  30. data/app/views/open_conference_ware/tracks/_form.html.erb +2 -2
  31. data/app/views/open_conference_ware/users/_account_box.html.erb +1 -1
  32. data/config/routes.rb +1 -1
  33. data/gem-public_cert.pem +20 -20
  34. data/lib/open_conference_ware/version.rb +1 -1
  35. data/lib/tasks/export.rake +1 -1
  36. data/open_conference_ware.gemspec +7 -7
  37. data/spec/controllers/open_conference_ware/proposals_controller_spec.rb +1 -1
  38. data/util/README.md +3 -0
  39. data/util/assign_rooms.rb +40 -0
  40. data/util/seed_schedule.rb +2 -2
  41. data/util/user_favorites_contention_report.rb +2 -2
  42. data/vendor/assets/images/openid-selector/openid-providers-en.png +0 -0
  43. data/vendor/assets/javascripts/openid-selector/openid-en.js +61 -0
  44. data/vendor/assets/javascripts/openid-selector/openid-jquery.js +201 -0
  45. data/vendor/assets/stylesheets/openid-selector/openid.css.scss +79 -0
  46. metadata +55 -61
  47. metadata.gz.sig +0 -0
  48. data/vendor/assets/images/idselector/aol.ico +0 -0
  49. data/vendor/assets/images/idselector/arrow.gif +0 -0
  50. data/vendor/assets/images/idselector/arrow_white_back.png +0 -0
  51. data/vendor/assets/images/idselector/arrow_white_forward.png +0 -0
  52. data/vendor/assets/images/idselector/blogger.ico +0 -0
  53. data/vendor/assets/images/idselector/claimid.ico +0 -0
  54. data/vendor/assets/images/idselector/flickr.ico +0 -0
  55. data/vendor/assets/images/idselector/google.ico +0 -0
  56. data/vendor/assets/images/idselector/lj.ico +0 -0
  57. data/vendor/assets/images/idselector/myopenid.ico +0 -0
  58. data/vendor/assets/images/idselector/openid.ico +0 -0
  59. data/vendor/assets/images/idselector/technorati.ico +0 -0
  60. data/vendor/assets/images/idselector/verisign.ico +0 -0
  61. data/vendor/assets/images/idselector/vidoop2.ico +0 -0
  62. data/vendor/assets/images/idselector/vox.ico +0 -0
  63. data/vendor/assets/images/idselector/yahoo.ico +0 -0
data.tar.gz.sig CHANGED
Binary file
@@ -6,10 +6,16 @@ bundler_args: --without debug
6
6
  rvm:
7
7
  - 1.9.3
8
8
  - 2.0.0
9
+ - 2.1.5
10
+ - 2.2.0
11
+ matrix:
12
+ allow_failures:
13
+ - rvm: 2.2.0
9
14
  env:
10
15
  - DB=mysql
11
16
  - DB=postgresql
12
17
  - DB=sqlite
18
+ cache: bundler
13
19
  before_script:
14
20
  - sqlite3 --version
15
21
  - mysql --version
data/CHANGES.md CHANGED
@@ -3,7 +3,20 @@
3
3
  OpenConferenceWare stable releases and changes included, with latest at top:
4
4
 
5
5
  ### master
6
+
7
+ ### v1.0.0.pre3
8
+ - Added missing database indexes and improved index naming
9
+ - Fixed image paths in CSS
10
+ - Fixed some issues with the Ignite-style proposal list
11
+ - Added a feature flag to enable/disable user favorites
12
+ - Improved handling of OmniAuth OpenID and failure cases
13
+ - Removed CacheLookupsMixin
14
+ - Extracted sensitive configuration values to config/secrets.yml
15
+
16
+ ### v1.0.0.pre2
6
17
  - Improved gem packaging
18
+ - Added a generator to copy views from the engine into the host app
19
+ - Cleaned up file naming and unnecessary files
7
20
 
8
21
  ### v1.0.0.pre1
9
22
  - Converted to a Rails engine
@@ -5,6 +5,8 @@
5
5
  //= require jquery.localScroll
6
6
  //= require farbtastic
7
7
  //= require audiojs/audio.min
8
+ //= require openid-selector/openid-jquery
9
+ //= require openid-selector/openid-en
8
10
  //= require bootstrap
9
11
  //= require open_conference_ware/base
10
12
  //= require open_conference_ware/util
@@ -54,14 +54,6 @@ function bind_proposal_generic_control(kind, elements) {
54
54
  if (matcher) {
55
55
  target.html(matcher[1]);
56
56
  }
57
-
58
- // Hide or unhide the room and schedule controls based on the proposal's state
59
- var dependent = target.parent().parent().find('.proposal_admin_controls_dependent_on_confirmed_status');
60
- if (response['proposal_status'] == 'confirmed') {
61
- dependent.show();
62
- } else {
63
- dependent.hide();
64
- }
65
57
  }
66
58
  }
67
59
  });
@@ -84,10 +76,14 @@ function bind_proposal_schedule_controls() {
84
76
  if(target.parent().find('option:selected[value]').get().length == 3) {
85
77
 
86
78
  data = {
87
- 'authenticity_token': app.authenticity_token,
88
- 'start_time[date]': target.parent().find('select.date').attr('value'),
89
- 'start_time[hour]': target.parent().find('select.hour').attr('value'),
90
- 'start_time[minute]': target.parent().find('select.minute').attr('value')
79
+ proposal: {
80
+ authenticity_token: app.authenticity_token,
81
+ start_time: {
82
+ date: target.parent().find('select.date').attr('value'),
83
+ hour: target.parent().find('select.hour').attr('value'),
84
+ minute: target.parent().find('select.minute').attr('value')
85
+ }
86
+ }
91
87
  };
92
88
  proposal_id = target.parent().attr('id').split('_').pop();
93
89
  format = 'json';
@@ -3,6 +3,7 @@
3
3
  *= require bootstrap-theme
4
4
  *= require persona-buttons
5
5
  *= require farbtastic
6
+ *= require openid-selector/openid
6
7
  *= require open_conference_ware/custom
7
8
  */
8
9
 
@@ -29,6 +29,10 @@ module OpenConferenceWare
29
29
  before_filter :log_the_current_user
30
30
  before_filter :log_the_session
31
31
 
32
+ rescue_from ActionController::UnknownFormat do |e|
33
+ render(text: 'Not Found', status: 404)
34
+ end
35
+
32
36
  #---[ Authentication ]--------------------------------------------------
33
37
 
34
38
  # Store the given user in the session.
@@ -149,9 +153,7 @@ module OpenConferenceWare
149
153
  def notify(level, message)
150
154
  level = level.to_sym
151
155
  raise ArgumentError, "Invalid flash notification level: #{level}" unless NOTIFY_LEVELS.include?(level)
152
- flash[level] ?
153
- flash[level] << " #{message}".html_safe :
154
- flash[level] = "#{message}".html_safe
156
+ flash[level] = "#{flash[level]} #{message}".strip.html_safe
155
157
  end
156
158
 
157
159
  #---[ Access control ]--------------------------------------------------
@@ -257,7 +259,7 @@ module OpenConferenceWare
257
259
  # Try finding event using params:
258
260
  event_id_key = controller_name == "events" ? :id : :event_id
259
261
  if key = params[event_id_key]
260
- if event = Event.find(key)
262
+ if event = Event.find_by_slug(key)
261
263
  return [event, :assigned_to_param]
262
264
  else
263
265
  logger.info "error, couldn't find event from key: #{key}"
@@ -469,7 +471,7 @@ module OpenConferenceWare
469
471
  if @event
470
472
  if event_tracks? && @event.tracks.size == 0
471
473
  if admin?
472
- notify :notice, "This event needs a track, you should #{view_context.link_to 'create one', new_event_track_path(@event)}."
474
+ notify :notice, "This event needs a track, you should #{view_context.link_to 'create one', new_event_track_path(@event)}.".html_safe
473
475
  else
474
476
  notify :failure, "This event has no tracks, an admin must create at least one."
475
477
  end
@@ -477,7 +479,7 @@ module OpenConferenceWare
477
479
 
478
480
  if event_session_types? && @event.session_types.size == 0
479
481
  if admin?
480
- notify :notice, "This event needs a session type, you should #{view_context.link_to 'create one', new_event_session_type_path(@event)}."
482
+ notify :notice, "This event needs a session type, you should #{view_context.link_to 'create one', new_event_session_type_path(@event)}.".html_safe
481
483
  else
482
484
  notify :failure, "This event has no session types, an admin must create at least one."
483
485
  end
@@ -34,7 +34,7 @@ module OpenConferenceWare
34
34
 
35
35
  def failure
36
36
  flash[:error] = params[:message]
37
- redirect sign_in_path
37
+ redirect_to sign_in_path
38
38
  end
39
39
 
40
40
  protected
@@ -14,6 +14,7 @@ module OpenConferenceWare
14
14
  respond_to do |format|
15
15
  format.html
16
16
  format.json { render json: @events }
17
+ format.xml { render xml: @events }
17
18
  end
18
19
  end
19
20
 
@@ -21,6 +22,7 @@ module OpenConferenceWare
21
22
  respond_to do |format|
22
23
  format.html { redirect_to event_proposals_path(@event) }
23
24
  format.json { render json: @event }
25
+ format.xml { render xml: @event }
24
26
  end
25
27
  end
26
28
 
@@ -29,7 +31,9 @@ module OpenConferenceWare
29
31
 
30
32
  respond_to do |format|
31
33
  format.html
32
- format.csv { render csv: @speakers, style: admin? ? :full : :public }
34
+ format.json { render json: @speakers }
35
+ format.xml { render xml: @speakers }
36
+ format.csv { render csv: @speakers, style: admin? ? :full : :public }
33
37
  end
34
38
  end
35
39
  end
@@ -53,10 +53,10 @@ module OpenConferenceWare
53
53
  # index.atom.builder
54
54
  if @event_assignment == :assigned_to_param
55
55
  @cache_key = "proposals_atom,event_#{@event.id}"
56
- @proposals = Defer { @event.populated_proposals(:proposals).order("submitted_at desc").limit(MAX_FEED_ITEMS) }
56
+ @proposals = Defer { @event.populated_proposals(:proposals).reorder("submitted_at desc").limit(MAX_FEED_ITEMS) }
57
57
  else
58
58
  @cache_key = "proposals_atom,all"
59
- @proposals = Defer { Proposal.populated.order("submitted_at desc").limit(MAX_FEED_ITEMS) }
59
+ @proposals = Defer { Proposal.populated.reorder("submitted_at desc").limit(MAX_FEED_ITEMS) }
60
60
  end
61
61
  }
62
62
  format.csv {
@@ -233,11 +233,11 @@ module OpenConferenceWare
233
233
  params[:proposal].delete(:title)
234
234
  end
235
235
 
236
- if params[:start_time] && admin?
237
- if params[:start_time][:date].blank? || params[:start_time][:hour].blank? || params[:start_time][:minute].blank?
236
+ if params[:proposal][:start_time] && admin?
237
+ if params[:proposal][:start_time][:date].blank? || params[:proposal][:start_time][:hour].blank? || params[:proposal][:start_time][:minute].blank?
238
238
  @proposal.start_time = nil
239
239
  else
240
- @proposal.start_time = "#{params[:start_time][:date]} #{params[:start_time][:hour]}:#{params[:start_time][:minute]}"
240
+ @proposal.start_time = "#{params[:proposal][:start_time][:date]} #{params[:proposal][:start_time][:hour]}:#{params[:proposal][:start_time][:minute]}"
241
241
  end
242
242
  end
243
243
 
@@ -260,7 +260,7 @@ module OpenConferenceWare
260
260
  render(
261
261
  json: {
262
262
  proposal_status: @proposal.status,
263
- _transition_control_html: render_to_string(partial: '/proposals/transition_control')
263
+ _transition_control_html: render_to_string(partial: '/open_conference_ware/proposals/transition_control', formats: [:html])
264
264
  },
265
265
  status: :ok
266
266
  )
@@ -357,7 +357,8 @@ module OpenConferenceWare
357
357
  :track_id,
358
358
  :session_type_id,
359
359
  :speaking_experience,
360
- :audience_level]
360
+ :audience_level,
361
+ :tag_list]
361
362
 
362
363
  permitted += [:status, :room_id, :start_time, :audio_url] if admin?
363
364
 
@@ -433,7 +434,7 @@ module OpenConferenceWare
433
434
  end
434
435
 
435
436
  def assert_user_complete_profile
436
- if user_profiles? and logged_in? and not current_user.complete_profile?
437
+ if user_profiles? && logged_in? && !current_user.admin? && !current_user.complete_profile?
437
438
  current_user.complete_profile = true
438
439
  if current_user.valid?
439
440
  current_user.save
@@ -53,7 +53,7 @@ module OpenConferenceWare
53
53
 
54
54
  respond_to do |format|
55
55
  if @session_type.save
56
- flash[:notice] = 'SessionType was successfully created.'
56
+ flash[:notice] = 'Session type was successfully created.'
57
57
  format.html { redirect_to(session_types_path) }
58
58
  format.json { render json: @session_type, status: :created, location: @session_type }
59
59
  format.xml { render xml: @session_type, status: :created, location: @session_type }
@@ -70,7 +70,7 @@ module OpenConferenceWare
70
70
  def update
71
71
  respond_to do |format|
72
72
  if @session_type.update_attributes(session_type_params)
73
- flash[:notice] = 'SessionType was successfully updated.'
73
+ flash[:notice] = 'Session type was successfully updated.'
74
74
  format.html { redirect_to(@session_type) }
75
75
  format.json { head :ok }
76
76
  format.xml { head :ok }
@@ -47,7 +47,7 @@ module OpenConferenceWare
47
47
  end
48
48
 
49
49
  def serializable_hash(options={})
50
- if (options.keys & [:only, :except, :methods, :include]).present?
50
+ if options && (options.keys & [:only, :except, :methods, :include]).present?
51
51
  super(options)
52
52
  else
53
53
  public_attributes
@@ -108,9 +108,8 @@ module OpenConferenceWare
108
108
  def proposals_for_stats
109
109
  return self.proposals.
110
110
  order("created_at").
111
- where("proposals.id, proposals.track_id, proposals.created_at, proposals.submitted_at, proposals.session_type_id, proposals.status").
112
- includes(:track, :session_type).
113
- all
111
+ select("open_conference_ware_proposals.id, open_conference_ware_proposals.track_id, open_conference_ware_proposals.created_at, open_conference_ware_proposals.submitted_at, open_conference_ware_proposals.session_type_id, open_conference_ware_proposals.status").
112
+ includes(:track, :session_type)
114
113
  end
115
114
 
116
115
  # Return an array of the Event's ScheduleItems and Proposal sessions that
@@ -155,7 +154,11 @@ module OpenConferenceWare
155
154
 
156
155
  # Return other Event objects.
157
156
  def other_events
158
- return self.class.select("id, title").order("title asc").where('id != ?', self.id)
157
+ if new_record?
158
+ self.class.all
159
+ else
160
+ self.class.select("id, title").order("title asc").where('id != ?', self.id)
161
+ end
159
162
  end
160
163
 
161
164
  # Return array of Rooms for this event and its parent event.
@@ -38,5 +38,9 @@ module OpenConferenceWare
38
38
  medium: "350>",
39
39
  small: "150>"
40
40
  }
41
+
42
+ validates_attachment_content_type :image,
43
+ :content_type => /\Aimage\/.*\Z/,
44
+ :unless => Proc.new{|r| r.image_content_type.blank? }
41
45
  end
42
46
  end
@@ -46,6 +46,9 @@ module OpenConferenceWare
46
46
  raise TypeError
47
47
  end
48
48
  write_attribute(:color,new_color.html)
49
+ rescue ArgumentError
50
+ write_attribute(:color, nil)
51
+ errors.add(:color, "is not a recognized HTML color")
49
52
  end
50
53
  end
51
54
  end
@@ -109,29 +109,35 @@ module OpenConferenceWare
109
109
  email
110
110
  end
111
111
 
112
- base_comma_attributes = lambda {
112
+ comma :full do
113
+ email
113
114
  id
114
115
  first_name
115
116
  last_name
116
117
  affiliation
117
118
  biography
118
- photo url: 'Photo'
119
119
  website
120
120
  twitter
121
121
  identica
122
122
  blog_url
123
- created_at xmlschema: 'Created'
124
- updated_at xmlschema: 'Updated'
123
+ created_at 'Created'
124
+ updated_at 'Updated'
125
125
  proposals ids: 'Session ids'
126
- }
127
-
128
- comma :full do
129
- email
130
- instance_eval &base_comma_attributes
131
126
  end
132
127
 
133
128
  comma :public do
134
- instance_eval &base_comma_attributes
129
+ id
130
+ first_name
131
+ last_name
132
+ affiliation
133
+ biography
134
+ website
135
+ twitter
136
+ identica
137
+ blog_url
138
+ created_at 'Created'
139
+ updated_at 'Updated'
140
+ proposals ids: 'Session ids'
135
141
  end
136
142
 
137
143
  #---[ PaperClip avatar images ]-----------------------------------------
@@ -144,6 +150,10 @@ module OpenConferenceWare
144
150
  avatar: '48x48#'
145
151
  }
146
152
 
153
+ validates_attachment_content_type :photo,
154
+ :content_type => /\Aimage\/.*\Z/,
155
+ :unless => Proc.new{|r| r.photo_content_type.blank? }
156
+
147
157
  #---[ Methods ]---------------------------------------------------------
148
158
 
149
159
  def self.create_from_authentication(auth)
@@ -51,6 +51,9 @@
51
51
  <% if proposal_statuses? %>
52
52
  <li><%= link_to "Sessions", event_sessions_path(nav_event) %></li>
53
53
  <% end %>
54
+ <% if proposal_start_times? %>
55
+ <li><%= link_to "Schedule", event_schedule_path(nav_event) %></li>
56
+ <% end %>
54
57
  <li><%= link_to "Proposals", event_proposals_path(nav_event) %>
55
58
  <li><%= link_to "- Bulk edit", manage_event_proposals_path(nav_event) %></li>
56
59
  <% unless nav_event.accepting_proposals? %>
@@ -89,7 +89,7 @@
89
89
  </ul>
90
90
  </li>
91
91
  </ul>
92
- &copy; 2008&ndash;<%= Date.today.year %> <%= OpenConferenceWare.organization %>
92
+ &copy; <%= Date.today.year %> <%= OpenConferenceWare.organization %>
93
93
  </div>
94
94
  </div><!--wrapper -->
95
95
 
@@ -101,26 +101,5 @@
101
101
  <%= yield :javascript %>
102
102
  </script>
103
103
 
104
- <% if Rails.env == "production" %>
105
- <script type="text/javascript">
106
- var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
107
- document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
108
- </script>
109
- <script type="text/javascript">
110
- var pageTracker = _gat._getTracker("UA-168427-8");
111
- pageTracker._initData();
112
- pageTracker._trackPageview();
113
- </script>
114
-
115
- <script type="text/javascript">
116
- var pkBaseURL = (("https:" == document.location.protocol) ? "https://opensourcebridge.org/stats/piwik/" : "http://opensourcebridge.org/stats/piwik/");
117
- document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
118
- </script><script type="text/javascript">
119
- piwik_action_name = '';
120
- piwik_idsite = 1;
121
- piwik_url = pkBaseURL + "piwik.php";
122
- piwik_log(piwik_action_name, piwik_idsite, piwik_url);
123
- </script>
124
- <% end %>
125
104
  </body>
126
105
  </html>
@@ -1,11 +1,25 @@
1
- <div class="auth-provider openid">
2
- <h3>OpenID</h3>
3
- <p><%= snippet_for :login_openid_text %></p>
4
- <form action="<%= auth_path(:open_id) %>" method='post' noValidate='noValidate' class="form-inline">
5
- <div class="form-group">
6
- <label for='openid_url' class="sr-only">OpenID Identifier:</label>
7
- <input type='url' id='openid_url' name='openid_url' class='form-control' placeholder='OpenID Identifier'/>
8
- </div>
9
- <button type='submit' class='btn btn-primary'>Sign In</button>
10
- </form>
1
+ <div class="auth-provider">
2
+ <h3>OpenID</h3>
3
+
4
+ <%= form_tag(auth_path(:open_id), :id => "openid_form" ) do %>
5
+ <fieldset>
6
+ <div id="openid_choice">
7
+ <p>Please click your account provider:</p>
8
+ <div id="openid_btns"></div>
9
+ </div>
10
+ <div id="openid_input_area" class="form-group">
11
+ <%= text_field_tag "openid_url", "http://", id: "openid_url", class: 'form-control' %>
12
+ <%= submit_tag 'Log in', class: 'btn btn-default' %>
13
+ </div>
14
+ <noscript>
15
+ <p><%= snippet_for :login_openid_text %></p>
16
+ </noscript>
17
+ </fieldset>
18
+ <% end %>
11
19
  </div>
20
+
21
+ <% run_when_dom_is_ready <<-JS
22
+ openid.img_path = '/assets/openid-selector/';
23
+ openid.init('openid_url');
24
+ JS
25
+ %>