concerto_content_scheduling 0.0.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.
Files changed (57) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +13 -0
  3. data/README.md +2 -0
  4. data/Rakefile +34 -0
  5. data/app/assets/javascripts/concerto_content_scheduling/application.js +15 -0
  6. data/app/assets/javascripts/concerto_content_scheduling/selectTime.js +6 -0
  7. data/app/assets/stylesheets/concerto_content_scheduling/application.css +16 -0
  8. data/app/controllers/concerto_content_scheduling/application_controller.rb +4 -0
  9. data/app/helpers/concerto_content_scheduling/application_helper.rb +4 -0
  10. data/app/models/concerns/scheduling.rb +83 -0
  11. data/app/views/concerto_content_scheduling/content/_details.html.erb +13 -0
  12. data/app/views/concerto_content_scheduling/content/_schedule.html.erb +50 -0
  13. data/app/views/concerto_content_scheduling/content/_tile_labels.html.erb +3 -0
  14. data/app/views/layouts/concerto_content_scheduling/application.html.erb +14 -0
  15. data/config/locales/en.yml +15 -0
  16. data/config/routes.rb +2 -0
  17. data/db/migrate/20140618183357_add_schedule_to_contents.rb +5 -0
  18. data/lib/concerto_content_scheduling.rb +4 -0
  19. data/lib/concerto_content_scheduling/engine.rb +38 -0
  20. data/lib/concerto_content_scheduling/version.rb +3 -0
  21. data/lib/tasks/concerto_content_scheduling_tasks.rake +4 -0
  22. data/test/concerto_content_scheduling_test.rb +7 -0
  23. data/test/dummy/README.rdoc +28 -0
  24. data/test/dummy/Rakefile +6 -0
  25. data/test/dummy/app/assets/javascripts/application.js +13 -0
  26. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  27. data/test/dummy/app/controllers/application_controller.rb +5 -0
  28. data/test/dummy/app/helpers/application_helper.rb +2 -0
  29. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  30. data/test/dummy/bin/bundle +3 -0
  31. data/test/dummy/bin/rails +4 -0
  32. data/test/dummy/bin/rake +4 -0
  33. data/test/dummy/config.ru +4 -0
  34. data/test/dummy/config/application.rb +23 -0
  35. data/test/dummy/config/boot.rb +5 -0
  36. data/test/dummy/config/database.yml +25 -0
  37. data/test/dummy/config/environment.rb +5 -0
  38. data/test/dummy/config/environments/development.rb +37 -0
  39. data/test/dummy/config/environments/production.rb +83 -0
  40. data/test/dummy/config/environments/test.rb +39 -0
  41. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  42. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  43. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  44. data/test/dummy/config/initializers/inflections.rb +16 -0
  45. data/test/dummy/config/initializers/mime_types.rb +4 -0
  46. data/test/dummy/config/initializers/session_store.rb +3 -0
  47. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  48. data/test/dummy/config/locales/en.yml +23 -0
  49. data/test/dummy/config/routes.rb +4 -0
  50. data/test/dummy/config/secrets.yml +22 -0
  51. data/test/dummy/public/404.html +67 -0
  52. data/test/dummy/public/422.html +67 -0
  53. data/test/dummy/public/500.html +66 -0
  54. data/test/dummy/public/favicon.ico +0 -0
  55. data/test/integration/navigation_test.rb +10 -0
  56. data/test/test_helper.rb +15 -0
  57. metadata +204 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: cd009084f48ed4f67f8fdc7d3d061a7ec088c98e
4
+ data.tar.gz: d712aa0fa7a4ca642a1dbd3d3c15592bcc3d8635
5
+ SHA512:
6
+ metadata.gz: 77f57feac651849f67ef8807298ac92fe467d3598c542d2f02428d59b4dba24b129512b1cfc8acb849a72e1886d74d3142f94fcf053c0d923710aacd8a13cc8b
7
+ data.tar.gz: 829039e8fa16d505f9b4e824e6bca8c1f888f7f9b594dedbe63c52a483f96c68c32a1458696b4f1091affc4bb350a62a5cfd6caa60ae7a121c71fbd1f8863bd1
data/LICENSE ADDED
@@ -0,0 +1,13 @@
1
+ Copyright 2014 Concerto Authors
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
data/README.md ADDED
@@ -0,0 +1,2 @@
1
+ Concerto Content Scheduling
2
+ ===========================
data/Rakefile ADDED
@@ -0,0 +1,34 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'ConcertoContentScheduling'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
18
+ load 'rails/tasks/engine.rake'
19
+
20
+
21
+
22
+ Bundler::GemHelper.install_tasks
23
+
24
+ require 'rake/testtask'
25
+
26
+ Rake::TestTask.new(:test) do |t|
27
+ t.libs << 'lib'
28
+ t.libs << 'test'
29
+ t.pattern = 'test/**/*_test.rb'
30
+ t.verbose = false
31
+ end
32
+
33
+
34
+ task default: :test
@@ -0,0 +1,15 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file.
9
+ //
10
+ // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require recurring_select
14
+ //= require jquery.timepicker.js
15
+ //= require_tree .
@@ -0,0 +1,6 @@
1
+ function initSelectTime() {
2
+ $('.timefield').timepicker();
3
+ }
4
+
5
+ $(document).ready(initSelectTime);
6
+ $(document).on('page:change', initSelectTime);
@@ -0,0 +1,16 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any styles
10
+ * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
11
+ * file per style scope.
12
+ *
13
+ *= require_self
14
+ *= require recurring_select
15
+ *= require_tree .
16
+ */
@@ -0,0 +1,4 @@
1
+ module ConcertoContentScheduling
2
+ class ApplicationController < ::ApplicationController
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module ConcertoContentScheduling
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,83 @@
1
+ module Concerns::Scheduling
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ attr_accessor :schedule_info
6
+
7
+ after_initialize :create_schedule_info
8
+ after_find :load_schedule_info
9
+ before_validation :save_schedule_info
10
+
11
+ def self.form_attributes
12
+ # Content's original form_attributes, plus our new ones
13
+ [:name, :duration, :data, {:start_time => [:time, :date]}, {:end_time => [:time, :date]}] + [:schedule_info => [:criteria, :start_time, :end_time]]
14
+ end
15
+ end
16
+
17
+ module ClassMethods
18
+ end
19
+
20
+ def has_schedule?
21
+ if self.blank? or self.schedule_info.blank? or !self.schedule_info.is_a?(Hash) or
22
+ !self.schedule_info.include?("start_time") or !self.schedule_info.include?("end_time") or
23
+ !self.schedule_info.include?("criteria") or self.schedule_info["start_time"].blank? or
24
+ self.schedule_info["end_time"].blank? or self.schedule_info["criteria"].blank? or self.schedule_info["criteria"] == "null"
25
+ return false
26
+ end
27
+ return true
28
+ end
29
+
30
+ def is_active_per_schedule?
31
+ active = true
32
+
33
+ if !has_schedule?
34
+ # missing or incomplete schedule information so assume active
35
+ else
36
+ # see if it is within the viewing window for the day
37
+ begin
38
+ if Clock.time >= Time.parse(self.schedule_info['start_time']) && Clock.time <= Time.parse(self.schedule_info['end_time'])
39
+ # and it matches the criteria
40
+ s = IceCube::Schedule.new(self.start_time)
41
+ s.add_recurrence_rule(RecurringSelect.dirty_hash_to_rule(self.schedule_info['criteria']))
42
+ active = s.occurs_on? Clock.time
43
+ else
44
+ active = false
45
+ end
46
+ rescue => e
47
+ active = false
48
+ Rails.logger.error("Unable to determine if schedule is active - #{e.message} for content #{self.id}")
49
+ end
50
+ end
51
+
52
+ active
53
+ end
54
+
55
+ def create_schedule_info
56
+ self.schedule_info = {
57
+ "start_time" => ConcertoConfig[:content_default_start_time],
58
+ "end_time" => ConcertoConfig[:content_default_end_time],
59
+ "criteria" => nil
60
+ } if self.schedule_info.nil?
61
+ end
62
+
63
+ def load_schedule_info
64
+ self.schedule_info = JSON.load(self.schedule) rescue {}
65
+ create_schedule_info
66
+ if self.schedule_info.has_key?('criteria') and self.schedule_info['criteria'] == 'null'
67
+ self.schedule_info['criteria'] = nil
68
+ end
69
+ end
70
+
71
+ def save_schedule_info
72
+ self.schedule = JSON.dump(self.schedule_info)
73
+ end
74
+
75
+ def schedule_in_words
76
+ if has_schedule?
77
+ s = IceCube::Schedule.new(self.start_time)
78
+ s.add_recurrence_rule(RecurringSelect.dirty_hash_to_rule(self.schedule_info['criteria']))
79
+ s.to_s
80
+ end
81
+ end
82
+
83
+ end
@@ -0,0 +1,13 @@
1
+ <div class="subblock">
2
+ <p class="uppercase" style="margin-bottom: 0px;"><small><b><%= t('.schedule') %></b></small></p>
3
+
4
+ <ul>
5
+ <% if @content.respond_to?(:has_schedule?) and @content.has_schedule? %>
6
+ <li><%=t('.from') %> <%= l Time.parse(@content.schedule_info['start_time']), :format => :twelve_hour_time %></li>
7
+ <li><%=t('.until') %> <%= l Time.parse(@content.schedule_info['end_time']),:format => :twelve_hour_time %></li>
8
+ <li><%= @content.schedule_in_words %></li>
9
+ <% else %>
10
+ <li><%=t('.available')%></li>
11
+ <% end %>
12
+ </ul>
13
+ </div>
@@ -0,0 +1,50 @@
1
+ <%= stylesheet_link_tag "concerto_content_scheduling/application", media: "all" %>
2
+ <%= javascript_include_tag "concerto_content_scheduling/application" %>
3
+
4
+ <%
5
+ rules = []
6
+ if !@content.schedule_info.blank? and @content.schedule_info.has_key?('criteria') and
7
+ !@content.schedule_info['criteria'].blank? and @content.schedule_info['criteria'] != "null"
8
+ rules << RecurringSelect.dirty_hash_to_rule(@content.schedule_info['criteria'])
9
+ end
10
+ %>
11
+
12
+ <fieldset>
13
+ <legend><span><%=t('.schedule')%></span></legend>
14
+ <%= form.fields_for :schedule_info do |schedule| %>
15
+ <div class="row-fluid">
16
+ <div class="span6">
17
+ <%= schedule.label :criteria, t('.frequency') %>
18
+ <%= schedule.select_recurring :criteria, rules %>
19
+ </div>
20
+ </div>
21
+
22
+ <br />
23
+
24
+ <div class="row-fluid">
25
+ <div class="span3">
26
+ <div class="clearfix datetime">
27
+ <%= schedule.label :start_time, t('.from_time')%>
28
+ <div class="input">
29
+ <div class="input-prepend">
30
+ <span class="add-on"><%= t(:at) %></span>
31
+ <%= schedule.text_field :start_time, :maxlength => 20, :value => @content.schedule_info['start_time'], :class => "timefield input-small" %>
32
+ </div>
33
+ </div>
34
+ </div>
35
+ </div>
36
+
37
+ <div class="span3">
38
+ <div class="clearfix datetime">
39
+ <%= schedule.label :end_time, t('.until_time')%>
40
+ <div class="input">
41
+ <div class="input-prepend">
42
+ <span class="add-on"><%=t(:at)%></span>
43
+ <%= schedule.text_field :end_time, :value => @content.schedule_info['end_time'], :maxlength => 20, :class => "timefield input-small" %>
44
+ </div>
45
+ </div>
46
+ </div>
47
+ </div>
48
+ </div>
49
+ <% end %>
50
+ </fieldset>
@@ -0,0 +1,3 @@
1
+ <% if content.respond_to?(:has_schedule?) and content.has_schedule? %>
2
+ <i class="icon-time"></i>
3
+ <% end %>
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>ConcertoContentScheduling</title>
5
+ <%= stylesheet_link_tag "concerto_content_scheduling/application", media: "all" %>
6
+ <%= javascript_include_tag "concerto_content_scheduling/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
@@ -0,0 +1,15 @@
1
+ en:
2
+ concerto_content_scheduling:
3
+
4
+ content:
5
+ schedule:
6
+ frequency: 'Frequency'
7
+ schedule: 'Schedule'
8
+ from_time: 'From Time'
9
+ until_time: 'Until Time'
10
+ details:
11
+ available: 'Available'
12
+ from: 'from'
13
+ until: 'until'
14
+ not_scheduled: 'Not Scheduled'
15
+ schedule: 'Schedule'
data/config/routes.rb ADDED
@@ -0,0 +1,2 @@
1
+ ConcertoContentScheduling::Engine.routes.draw do
2
+ end
@@ -0,0 +1,5 @@
1
+ class AddScheduleToContents < ActiveRecord::Migration
2
+ def change
3
+ add_column :contents, :schedule, :text
4
+ end
5
+ end
@@ -0,0 +1,4 @@
1
+ require "concerto_content_scheduling/engine"
2
+
3
+ module ConcertoContentScheduling
4
+ end
@@ -0,0 +1,38 @@
1
+ require 'recurring_select'
2
+
3
+ module ConcertoContentScheduling
4
+ class Engine < ::Rails::Engine
5
+ isolate_namespace ConcertoContentScheduling
6
+ engine_name 'concerto_content_scheduling'
7
+
8
+ def plugin_info(plugin_info_class)
9
+ @plugin_info ||= plugin_info_class.new do
10
+
11
+ extend_model Content, ConcertoContentScheduling::Concerns::Scheduling
12
+
13
+ add_view_hook "ContentsController",
14
+ :content_form,
15
+ :partial => "concerto_content_scheduling/content/schedule"
16
+
17
+ add_view_hook "ContentsController",
18
+ :content_details,
19
+ :partial => "concerto_content_scheduling/content/details"
20
+
21
+ add_view_hook "ContentsController",
22
+ :tile_labels,
23
+ :partial => "concerto_content_scheduling/content/tile_labels"
24
+
25
+ # filter the contents according to the schedule
26
+ # the manykinds plugin if concurrently enabled will cause this to be skipped
27
+ add_controller_hook "Subscription", :filter_contents, :after do
28
+ @contents.reject!{|c| !c.is_active_per_schedule?}
29
+ end
30
+
31
+ add_controller_hook "ContentsController", :update_params, :after do
32
+ @attributes.concat([:schedule_info => [:criteria, :start_time, :end_time]])
33
+ end
34
+
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,3 @@
1
+ module ConcertoContentScheduling
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :concerto_content_scheduling do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,7 @@
1
+ require 'test_helper'
2
+
3
+ class ConcertoContentSchedulingTest < ActiveSupport::TestCase
4
+ test "truth" do
5
+ assert_kind_of Module, ConcertoContentScheduling
6
+ end
7
+ end
@@ -0,0 +1,28 @@
1
+ == README
2
+
3
+ This README would normally document whatever steps are necessary to get the
4
+ application up and running.
5
+
6
+ Things you may want to cover:
7
+
8
+ * Ruby version
9
+
10
+ * System dependencies
11
+
12
+ * Configuration
13
+
14
+ * Database creation
15
+
16
+ * Database initialization
17
+
18
+ * How to run the test suite
19
+
20
+ * Services (job queues, cache servers, search engines, etc.)
21
+
22
+ * Deployment instructions
23
+
24
+ * ...
25
+
26
+
27
+ Please feel free to use a different markup language if you do not plan to run
28
+ <tt>rake doc:app</tt>.
@@ -0,0 +1,6 @@
1
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
2
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+
4
+ require File.expand_path('../config/application', __FILE__)
5
+
6
+ Rails.application.load_tasks
@@ -0,0 +1,13 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file.
9
+ //
10
+ // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require_tree .
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any styles
10
+ * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
11
+ * file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */