transit 0.0.1 → 0.0.2
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/Gemfile +19 -11
- data/app/assets/images/transit/icon24x24.png +0 -0
- data/app/assets/images/transit/icon24x24_files.png +0 -0
- data/app/assets/images/transit/jplayer.swf +0 -0
- data/app/assets/images/transit/uploadify.swf +0 -0
- data/app/assets/images/transit/video_player.swf +0 -0
- data/app/assets/javascripts/jqtools/expose.js +224 -0
- data/app/assets/javascripts/jqtools/flashembed.js +300 -0
- data/app/assets/javascripts/jqtools/overlay.js +294 -0
- data/app/assets/javascripts/jqtools/scrollable.js +3 -0
- data/app/assets/javascripts/jqtools/scrollable/autoscroll.js +81 -0
- data/app/assets/javascripts/jqtools/scrollable/base.js +335 -0
- data/app/assets/javascripts/jqtools/scrollable/navigator.js +139 -0
- data/app/assets/javascripts/jqtools/validator.js +590 -0
- data/app/assets/javascripts/jqueryui/accordion.js +611 -0
- data/app/assets/javascripts/jqueryui/autocomplete.js +612 -0
- data/app/assets/javascripts/jqueryui/button.js +388 -0
- data/app/assets/javascripts/jqueryui/core.js +312 -0
- data/app/assets/javascripts/jqueryui/datepicker.js +1791 -0
- data/app/assets/javascripts/jqueryui/dialog.js +878 -0
- data/app/assets/javascripts/jqueryui/draggable.js +815 -0
- data/app/assets/javascripts/jqueryui/droppable.js +285 -0
- data/app/assets/javascripts/jqueryui/effects/blind.js +49 -0
- data/app/assets/javascripts/jqueryui/effects/bounce.js +78 -0
- data/app/assets/javascripts/jqueryui/effects/clip.js +54 -0
- data/app/assets/javascripts/jqueryui/effects/core.js +746 -0
- data/app/assets/javascripts/jqueryui/effects/drop.js +50 -0
- data/app/assets/javascripts/jqueryui/effects/explode.js +79 -0
- data/app/assets/javascripts/jqueryui/effects/fade.js +32 -0
- data/app/assets/javascripts/jqueryui/effects/fold.js +56 -0
- data/app/assets/javascripts/jqueryui/effects/highlight.js +50 -0
- data/app/assets/javascripts/jqueryui/effects/pulsate.js +51 -0
- data/app/assets/javascripts/jqueryui/effects/scale.js +178 -0
- data/app/assets/javascripts/jqueryui/effects/shake.js +57 -0
- data/app/assets/javascripts/jqueryui/effects/slide.js +50 -0
- data/app/assets/javascripts/jqueryui/effects/transfer.js +45 -0
- data/app/assets/javascripts/jqueryui/mouse.js +160 -0
- data/app/assets/javascripts/jqueryui/position.js +252 -0
- data/app/assets/javascripts/jqueryui/progressbar.js +109 -0
- data/app/assets/javascripts/jqueryui/resizable.js +814 -0
- data/app/assets/javascripts/jqueryui/selectable.js +266 -0
- data/app/assets/javascripts/jqueryui/slider.js +666 -0
- data/app/assets/javascripts/jqueryui/sortable.js +1077 -0
- data/app/assets/javascripts/jqueryui/tabs.js +758 -0
- data/app/assets/javascripts/jqueryui/widget.js +262 -0
- data/app/assets/javascripts/libs/backbone.js +1152 -0
- data/app/assets/javascripts/libs/cookie.js +89 -0
- data/app/assets/javascripts/libs/fileinput.js +130 -0
- data/app/assets/javascripts/libs/jplayer.js +1768 -0
- data/app/assets/javascripts/libs/proper.js +541 -0
- data/app/assets/javascripts/libs/sanitize.js +282 -0
- data/app/assets/javascripts/libs/selecttolist.js +75 -0
- data/app/assets/javascripts/libs/underscore.js +807 -0
- data/app/assets/javascripts/libs/uploadify.js +677 -0
- data/app/assets/javascripts/libs/wymeditor.js +9538 -0
- data/app/assets/javascripts/transit.js +4 -0
- data/app/assets/javascripts/transit/admin.js +22 -0
- data/app/assets/javascripts/transit/admin/contexts.js +52 -0
- data/app/assets/javascripts/transit/admin/fields.js +36 -0
- data/app/assets/javascripts/transit/admin/upload.js +109 -0
- data/app/assets/javascripts/transit/config.js.erb +101 -0
- data/app/assets/javascripts/transit/contexts/audio.js +39 -0
- data/app/assets/javascripts/transit/contexts/video.js +79 -0
- data/app/assets/javascripts/transit/core.js +171 -0
- data/app/assets/javascripts/transit/frontend.js +3 -0
- data/app/assets/javascripts/transit/lib/base64.js +120 -0
- data/app/assets/javascripts/transit/lib/editor.js +177 -0
- data/app/assets/javascripts/transit/views/audio_player.jst +22 -0
- data/app/assets/javascripts/transit/views/editor_toolbar.jst +12 -0
- data/app/assets/javascripts/transit/views/file_upload.jst +5 -0
- data/app/assets/javascripts/transit/views/video_player.jst +20 -0
- data/app/assets/javascripts/transit/views/wym_box.jst +4 -0
- data/app/assets/javascripts/transit/views/wym_iframe.jst +3 -0
- data/app/assets/stylesheets/transit.css.scss.erb +42 -0
- data/app/assets/stylesheets/transit/forms.css.scss +66 -0
- data/app/assets/stylesheets/transit/media/audio.css.scss +65 -0
- data/app/assets/stylesheets/transit/media/video.css.scss +30 -0
- data/app/assets/stylesheets/transit/panel.css.scss +100 -0
- data/app/assets/stylesheets/transit/ui.css.scss +507 -0
- data/app/controllers/pages_controller.rb +3 -0
- data/app/controllers/posts_controller.rb +3 -0
- data/app/controllers/transit/assets_controller.rb +38 -0
- data/app/controllers/transit/contexts_controller.rb +12 -9
- data/app/controllers/transit/pages_controller.rb +26 -0
- data/app/controllers/transit/posts_controller.rb +31 -0
- data/app/controllers/transit/topics_controller.rb +5 -0
- data/app/controllers/transit_controller.rb +16 -0
- data/app/helpers/transit/admin_helper.rb +43 -0
- data/app/helpers/transit/form_helper.rb +17 -0
- data/app/helpers/transit/package_helper.rb +41 -0
- data/app/helpers/transit/pagination_helper.rb +58 -0
- data/app/helpers/transit_helper.rb +42 -0
- data/app/models/comment.rb +37 -0
- data/app/models/contexts/audio.rb +12 -0
- data/app/models/{text.rb → contexts/text.rb} +0 -0
- data/app/models/contexts/video.rb +24 -0
- data/app/models/topic.rb +19 -0
- data/app/models/transit/asset.rb +68 -0
- data/{lib → app/models}/transit/context.rb +29 -0
- data/app/views/contexts/_text.html.erb +1 -1
- data/app/views/posts/index.rss.builder +18 -0
- data/app/views/transit/assets/_file.html.erb +4 -0
- data/app/views/transit/assets/_image.html.erb +13 -0
- data/app/views/transit/assets/create.js.erb +8 -0
- data/app/views/transit/assets/destroy.js.erb +3 -0
- data/app/views/transit/assets/manage.html.erb +20 -0
- data/app/views/transit/contexts/_audio.html.erb +18 -0
- data/app/views/transit/contexts/_text.html.erb +6 -0
- data/app/views/transit/contexts/_video.html.erb +13 -0
- data/app/views/transit/contexts/destroy.js.erb +1 -0
- data/app/views/transit/contexts/index.html.erb +5 -0
- data/app/views/transit/contexts/new.js.erb +7 -0
- data/app/views/transit/contexts/show.html.erb +8 -0
- data/app/views/transit/index.html.erb +26 -0
- data/app/views/transit/index.js.erb +1 -0
- data/app/views/transit/interface/post_panel.html.erb +96 -0
- data/app/views/transit/pages/_table.html.erb +7 -0
- data/app/views/transit/pages/edit.html.erb +17 -0
- data/app/views/transit/pages/index.html.erb +17 -0
- data/app/views/transit/pages/update.js.erb +1 -0
- data/app/views/transit/posts/_form.html.erb +49 -0
- data/app/views/transit/posts/edit.html.erb +14 -0
- data/app/views/transit/posts/new.html.erb +21 -0
- data/app/views/transit/table.html.erb +13 -0
- data/app/views/transit/table.js.erb +8 -0
- data/app/views/transit/topics/manage.html.erb +28 -0
- data/config/locales/en.yml +22 -0
- data/config/routes.rb +3 -3
- data/lib/transit.rb +51 -17
- data/lib/transit/admin.rb +85 -0
- data/lib/transit/builders/form_builder.rb +319 -0
- data/lib/transit/builders/jst_builder.rb +38 -0
- data/lib/transit/builders/package_builder.rb +45 -0
- data/lib/transit/config.rb +20 -0
- data/lib/transit/controller/generator.rb +42 -0
- data/lib/transit/controller/responder.rb +34 -0
- data/lib/transit/core_ext.rb +18 -0
- data/lib/transit/errors/resource_not_found.rb +6 -0
- data/lib/transit/model/assets.rb +14 -0
- data/lib/transit/model/attachments.rb +55 -0
- data/lib/transit/model/auto_increment.rb +22 -0
- data/lib/transit/model/base.rb +56 -0
- data/lib/transit/model/comments.rb +19 -0
- data/lib/transit/model/hooks.rb +38 -0
- data/lib/transit/model/owners.rb +14 -0
- data/lib/transit/model/paginator.rb +92 -0
- data/lib/transit/model/topics.rb +14 -0
- data/lib/transit/package/page.rb +20 -12
- data/lib/transit/package/post.rb +87 -33
- data/lib/transit/package/post/validations.rb +14 -0
- data/lib/transit/rails/engine.rb +29 -13
- data/lib/transit/rails/railtie.rb +31 -0
- data/lib/transit/rails/routing.rb +11 -6
- data/lib/transit/services.rb +13 -0
- data/lib/transit/services/base.rb +14 -0
- data/lib/transit/services/facebook.rb +13 -0
- data/lib/transit/services/ted.rb +10 -0
- data/lib/transit/services/twitter.rb +13 -0
- data/lib/transit/services/vimeo.rb +10 -0
- data/lib/transit/services/you_tube.rb +12 -0
- data/lib/transit/version.rb +1 -1
- metadata +178 -31
- data/app/assets/stylesheets/includes/_compat.scss +0 -24
- data/app/assets/stylesheets/includes/_defaults.scss +0 -99
- data/app/assets/stylesheets/includes/_global.scss +0 -16
- data/app/assets/stylesheets/includes/_imports.scss +0 -27
- data/app/assets/stylesheets/includes/_mixins.scss +0 -38
- data/app/assets/stylesheets/includes/_setup.scss +0 -85
- data/app/assets/stylesheets/layout.css.scss +0 -29
- data/app/assets/stylesheets/transit.css +0 -3
- data/app/controllers/application_controller.rb +0 -5
- data/app/controllers/transit/index_controller.rb +0 -7
- data/app/controllers/transit/packages_controller.rb +0 -64
- data/app/controllers/transit/transit_controller.rb +0 -4
- data/app/helpers/routing_helpers.rb +0 -7
- data/app/models/audio.rb +0 -4
- data/app/models/package_asset.rb +0 -11
- data/app/models/video.rb +0 -8
- data/app/views/contexts/_audio.html.erb +0 -1
- data/app/views/contexts/_video.html.erb +0 -1
- data/app/views/layouts/transit.html.erb +0 -31
- data/app/views/transit/index/index.html.erb +0 -0
- data/lib/transit/helpers/controller_helpers.rb +0 -40
- data/lib/transit/helpers/model_helpers.rb +0 -26
- data/lib/transit/package.rb +0 -25
- data/lib/transit/package/base.rb +0 -49
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module Transit
|
|
2
|
+
module Builders
|
|
3
|
+
class JstBuilder < Tilt::Template
|
|
4
|
+
|
|
5
|
+
self.default_mime_type = 'application/javascript'
|
|
6
|
+
|
|
7
|
+
def prepare
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def evaluate(scope, locals, &block)
|
|
11
|
+
<<-JST
|
|
12
|
+
(function() {
|
|
13
|
+
try{
|
|
14
|
+
transit.template.add(#{scope.logical_path.inspect}, "#{sanitize_js(data)}");
|
|
15
|
+
}catch(e){};
|
|
16
|
+
}).call();
|
|
17
|
+
JST
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
def sanitize_js(string)
|
|
23
|
+
js_map = {
|
|
24
|
+
'\\' => '\\\\',
|
|
25
|
+
'</' => '<\/',
|
|
26
|
+
"\r\n" => '\n',
|
|
27
|
+
"\n" => '\n',
|
|
28
|
+
"\r" => '\n',
|
|
29
|
+
'"' => '\\"',
|
|
30
|
+
"'" => "\\'"
|
|
31
|
+
}
|
|
32
|
+
string.gsub(/$(.)/m, "\\1 ").strip.gsub(/(\\|<\/|\r\n|[\n\r"'])/) { |match| js_map[match] }
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module Transit
|
|
2
|
+
module Builders
|
|
3
|
+
class PackageBuilder
|
|
4
|
+
|
|
5
|
+
attr_accessor :form, :resource, :template
|
|
6
|
+
|
|
7
|
+
def initialize(model, form_builder)
|
|
8
|
+
@form = form_builder
|
|
9
|
+
@resource = model
|
|
10
|
+
@template = @form.template
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def body
|
|
14
|
+
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
private
|
|
18
|
+
|
|
19
|
+
def _create_field_for(method)
|
|
20
|
+
form_method = _lookup_proper_field(method)
|
|
21
|
+
args =[method]
|
|
22
|
+
if form_method.is_a?(Hash)
|
|
23
|
+
args << form_method[form_method.keys.first]
|
|
24
|
+
form_method = form_method.keys.first
|
|
25
|
+
end
|
|
26
|
+
form.send(form_method, *args)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def _lookup_proper_field(method)
|
|
30
|
+
resource.admin_options.fields[method]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def method_missing(*args)
|
|
34
|
+
instance_eval <<-METHOD, __FILE__, __LINE__ + 1
|
|
35
|
+
def #{args.first}
|
|
36
|
+
_create_field_for(:#{args.first})
|
|
37
|
+
end
|
|
38
|
+
METHOD
|
|
39
|
+
_create_field_for(args.first.to_sym)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Transit
|
|
2
|
+
module Config
|
|
3
|
+
|
|
4
|
+
mattr_accessor :assets
|
|
5
|
+
@@assets ||= {
|
|
6
|
+
styles: {
|
|
7
|
+
full: "475x>",
|
|
8
|
+
thumb: "50x50#",
|
|
9
|
+
small: "100x100#",
|
|
10
|
+
medium: "300x>",
|
|
11
|
+
original: "1500x1500>"
|
|
12
|
+
},
|
|
13
|
+
|
|
14
|
+
default_style: :full,
|
|
15
|
+
path: ":rails_root/public/system/assets/:uid/:style.:extension",
|
|
16
|
+
url: "/system/assets/:uid/:style.:extension"
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
require 'active_support/inflector'
|
|
2
|
+
|
|
3
|
+
module Transit
|
|
4
|
+
module Controller
|
|
5
|
+
|
|
6
|
+
class Generator
|
|
7
|
+
|
|
8
|
+
attr_accessor :types
|
|
9
|
+
|
|
10
|
+
def initialize(*klasses)
|
|
11
|
+
@types = klasses.map(&:to_s)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def generate!
|
|
15
|
+
@types.map(&:to_sym).each do |type|
|
|
16
|
+
typed_classes = Transit.lookup(type).dup.map!(&:constantize)
|
|
17
|
+
|
|
18
|
+
typed_classes.each do |sup|
|
|
19
|
+
sup.subclasses.each do |klass|
|
|
20
|
+
controller_name = to_controller(klass)
|
|
21
|
+
next if Transit.const_defined?( controller_name, false )
|
|
22
|
+
eval "class Transit::#{controller_name} < Transit::#{parent_controller(sup)}; end"
|
|
23
|
+
ActiveSupport::Dependencies::Reference.store(Transit.const_get("#{controller_name}"))
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def parent_controller(str)
|
|
31
|
+
p = ActiveSupport::Inflector.pluralize(str.to_s.classify)
|
|
32
|
+
"#{p}Controller"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def to_controller(str)
|
|
36
|
+
(ActiveSupport::Inflector.pluralize(str.to_s.classify) << "Controller")
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require 'responders'
|
|
2
|
+
require 'responders/flash_responder'
|
|
3
|
+
|
|
4
|
+
module Transit
|
|
5
|
+
module Controller
|
|
6
|
+
class Responder < ActionController::Responder
|
|
7
|
+
mattr_accessor :flash_keys
|
|
8
|
+
|
|
9
|
+
include Responders::FlashResponder
|
|
10
|
+
Responders::FlashResponder.flash_keys = [:success, :error]
|
|
11
|
+
|
|
12
|
+
@@flash_keys = [ :success, :error ]
|
|
13
|
+
|
|
14
|
+
def initialize(controller, resources, options={})
|
|
15
|
+
super
|
|
16
|
+
@flash = options.delete(:flash)
|
|
17
|
+
@notice = options.delete(:success)
|
|
18
|
+
@alert = options.delete(:error)
|
|
19
|
+
@flash_now = options.delete(:flash_now)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def to_js
|
|
23
|
+
if set_flash_message?
|
|
24
|
+
set_flash_message!
|
|
25
|
+
header_hash = {}
|
|
26
|
+
controller.flash.each{ |key, value| header_hash.merge!(key => value) }
|
|
27
|
+
controller.response['X-Flash-Messages'] = header_hash.to_json
|
|
28
|
+
end
|
|
29
|
+
defined?(super) ? super : to_format
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Transit
|
|
2
|
+
module CoreExt
|
|
3
|
+
|
|
4
|
+
module String
|
|
5
|
+
def to_slug
|
|
6
|
+
value = self.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n, '').to_s
|
|
7
|
+
value.gsub!(/[']+/, '')
|
|
8
|
+
value.gsub!(/\W+/, ' ')
|
|
9
|
+
value.strip!
|
|
10
|
+
value.downcase!
|
|
11
|
+
value.gsub!(' ', '-')
|
|
12
|
+
value
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
String.send(:include, Transit::CoreExt::String)
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
require 'paperclip'
|
|
2
|
+
|
|
3
|
+
module Transit
|
|
4
|
+
module Model
|
|
5
|
+
module Attachments
|
|
6
|
+
extend ActiveSupport::Concern
|
|
7
|
+
|
|
8
|
+
included do
|
|
9
|
+
include Paperclip::Glue
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
#Convenience method for only finding the assets that are images
|
|
13
|
+
def images
|
|
14
|
+
self.assets.find_all{ |asset| asset.image? }
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def image?
|
|
18
|
+
image.file?
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Convenience method for only finding the assets that are files
|
|
22
|
+
def files
|
|
23
|
+
self.assets.reject{ |asset| asset.image? }
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Override to show a "default image" in the admin.
|
|
27
|
+
def preview_image_url
|
|
28
|
+
nil
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
module ClassMethods
|
|
32
|
+
##
|
|
33
|
+
# Convenience method for Paperclip's has_attached_file to ensure fields also exist.
|
|
34
|
+
#
|
|
35
|
+
def attach(name, options = {})
|
|
36
|
+
|
|
37
|
+
if options[:styles].present?
|
|
38
|
+
options.reverse_merge!(original: '1500x1500>')
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
has_attached_file name, options
|
|
42
|
+
field :"#{name.to_s}_file_name", :type => String
|
|
43
|
+
field :"#{name.to_s}_content_type", :type => String
|
|
44
|
+
field :"#{name.to_s}_file_size", :type => Integer
|
|
45
|
+
field :"#{name.to_s}_updated_at", :type => Time
|
|
46
|
+
field :"#{name.to_s}_fingerprint", :type => String
|
|
47
|
+
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module Transit
|
|
2
|
+
module Model
|
|
3
|
+
##
|
|
4
|
+
# Provides SQL like auto-incrementing of an id using a "uid" field
|
|
5
|
+
#
|
|
6
|
+
module AutoIncrement
|
|
7
|
+
extend ActiveSupport::Concern
|
|
8
|
+
|
|
9
|
+
included do
|
|
10
|
+
field :uid, :type => Integer
|
|
11
|
+
before_create :generate_uid, :on => :create
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def generate_uid
|
|
15
|
+
return true unless self.uid.nil?
|
|
16
|
+
ref = (self.class.superclass == Object ? self.class : self.class.superclass)
|
|
17
|
+
self.uid = ref.max(:uid).to_i + 1
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
module Transit
|
|
2
|
+
module Model
|
|
3
|
+
|
|
4
|
+
module Base
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
included do
|
|
8
|
+
class_attribute :delivery_options, instance_writer: false
|
|
9
|
+
self.delivery_options ||= []
|
|
10
|
+
|
|
11
|
+
class_attribute :admin_options, instance_writer: false
|
|
12
|
+
|
|
13
|
+
include Mongoid::Timestamps
|
|
14
|
+
include Mongoid::MultiParameterAttributes
|
|
15
|
+
include Transit::Model::AutoIncrement
|
|
16
|
+
|
|
17
|
+
# All transit models embed many contexts
|
|
18
|
+
embeds_many :contexts, as: :package, autosave: true, class_name: 'Transit::Context'
|
|
19
|
+
accepts_nested_attributes_for :contexts, :allow_destroy => true
|
|
20
|
+
alias :contexts_attributes= :process_context_attributes=
|
|
21
|
+
before_create :ensure_text_context
|
|
22
|
+
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def context_named(n)
|
|
26
|
+
self.contexts.by_name(n).first
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
##
|
|
30
|
+
# Convenience method to determine the particular options this
|
|
31
|
+
# model delivers
|
|
32
|
+
#
|
|
33
|
+
def delivers?(opt)
|
|
34
|
+
self.class.delivery_options.include?(opt.to_s)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
##
|
|
38
|
+
# Each model should pre-build at least one context for its main body content
|
|
39
|
+
#
|
|
40
|
+
def ensure_text_context
|
|
41
|
+
return true unless self.contexts.size == 0
|
|
42
|
+
self.contexts.build({ :name => 'Body Copy' }, Text)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def process_context_attributes=(hash)
|
|
46
|
+
hash.each_pair do |pos, attrs|
|
|
47
|
+
attrs.stringify_keys!
|
|
48
|
+
field = self.contexts.all.detect{ |cf| cf.id.to_s == attrs['id'] } || self.contexts.build({ }, attrs['_type'].classify.constantize)
|
|
49
|
+
field.attributes = attrs
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Transit
|
|
2
|
+
module Model
|
|
3
|
+
|
|
4
|
+
module Comments
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
included do
|
|
8
|
+
field :comment_count, :type => Integer, :default => 0
|
|
9
|
+
has_many :comments, as: :commentable
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def has_comments?
|
|
13
|
+
self.comment_count >= 1
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module Transit
|
|
2
|
+
module Model
|
|
3
|
+
|
|
4
|
+
module Hooks
|
|
5
|
+
|
|
6
|
+
def deliver_as(type)
|
|
7
|
+
scope = type.to_s.classify
|
|
8
|
+
include Transit::Package.const_get(scope)
|
|
9
|
+
Transit.track(self, type.to_sym)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def deliver_with(*opts)
|
|
13
|
+
opts.map(&:to_s).map(&:classify).each do |t|
|
|
14
|
+
begin
|
|
15
|
+
include Transit::Model.const_get(t.pluralize)
|
|
16
|
+
rescue NameError
|
|
17
|
+
raise Transit::Errors::ResourceNotFound.new("You called deliver_with #{t.underscore} but no resource called #{t.pluralize} was found.")
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
self.delivery_options |= opts.map!(&:to_s)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Provide auto-incrementing functionality for any model
|
|
24
|
+
def auto_increment
|
|
25
|
+
include Transit::Model::AutoIncrement
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
Mongoid::Document::ClassMethods.class_eval do
|
|
34
|
+
include Transit::Model::Hooks
|
|
35
|
+
include Transit::Model::Paginator::ClassMethods
|
|
36
|
+
end
|
|
37
|
+
Mongoid::Criteria.send :include, Transit::Model::Paginator::Criteria
|
|
38
|
+
Mongoid::Document.send :include, Transit::Model::Paginator::Document
|