orange-core 0.5.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +145 -0
- data/lib/orange-core.rb +8 -0
- data/lib/orange-core/application.rb +132 -0
- data/lib/orange-core/assets/css/exceptions.css +50 -0
- data/lib/orange-core/assets/js/exceptions.js +44 -0
- data/lib/orange-core/carton.rb +178 -0
- data/lib/orange-core/core.rb +266 -0
- data/lib/orange-core/magick.rb +270 -0
- data/lib/orange-core/middleware/base.rb +96 -0
- data/lib/orange-core/middleware/database.rb +45 -0
- data/lib/orange-core/middleware/four_oh_four.rb +45 -0
- data/lib/orange-core/middleware/globals.rb +17 -0
- data/lib/orange-core/middleware/loader.rb +13 -0
- data/lib/orange-core/middleware/rerouter.rb +53 -0
- data/lib/orange-core/middleware/restful_router.rb +99 -0
- data/lib/orange-core/middleware/route_context.rb +39 -0
- data/lib/orange-core/middleware/route_site.rb +51 -0
- data/lib/orange-core/middleware/show_exceptions.rb +80 -0
- data/lib/orange-core/middleware/static.rb +67 -0
- data/lib/orange-core/middleware/static_file.rb +32 -0
- data/lib/orange-core/middleware/template.rb +60 -0
- data/lib/orange-core/packet.rb +232 -0
- data/lib/orange-core/plugin.rb +172 -0
- data/lib/orange-core/resource.rb +96 -0
- data/lib/orange-core/resources/mapper.rb +36 -0
- data/lib/orange-core/resources/model_resource.rb +228 -0
- data/lib/orange-core/resources/not_found.rb +10 -0
- data/lib/orange-core/resources/page_parts.rb +68 -0
- data/lib/orange-core/resources/parser.rb +113 -0
- data/lib/orange-core/resources/routable_resource.rb +16 -0
- data/lib/orange-core/resources/scaffold.rb +106 -0
- data/lib/orange-core/stack.rb +226 -0
- data/lib/orange-core/templates/exceptions.haml +111 -0
- data/lib/orange-core/views/default_resource/create.haml +4 -0
- data/lib/orange-core/views/default_resource/edit.haml +9 -0
- data/lib/orange-core/views/default_resource/list.haml +10 -0
- data/lib/orange-core/views/default_resource/show.haml +4 -0
- data/lib/orange-core/views/default_resource/table_row.haml +7 -0
- data/lib/orange-core/views/not_found/404.haml +2 -0
- data/spec/orange-core/application_spec.rb +183 -0
- data/spec/orange-core/carton_spec.rb +136 -0
- data/spec/orange-core/core_spec.rb +248 -0
- data/spec/orange-core/magick_spec.rb +96 -0
- data/spec/orange-core/middleware/base_spec.rb +38 -0
- data/spec/orange-core/middleware/globals_spec.rb +3 -0
- data/spec/orange-core/middleware/rerouter_spec.rb +3 -0
- data/spec/orange-core/middleware/restful_router_spec.rb +3 -0
- data/spec/orange-core/middleware/route_context_spec.rb +3 -0
- data/spec/orange-core/middleware/route_site_spec.rb +3 -0
- data/spec/orange-core/middleware/show_exceptions_spec.rb +3 -0
- data/spec/orange-core/middleware/static_file_spec.rb +3 -0
- data/spec/orange-core/middleware/static_spec.rb +3 -0
- data/spec/orange-core/mock/mock_app.rb +16 -0
- data/spec/orange-core/mock/mock_carton.rb +43 -0
- data/spec/orange-core/mock/mock_core.rb +2 -0
- data/spec/orange-core/mock/mock_middleware.rb +25 -0
- data/spec/orange-core/mock/mock_mixins.rb +19 -0
- data/spec/orange-core/mock/mock_model_resource.rb +47 -0
- data/spec/orange-core/mock/mock_pulp.rb +24 -0
- data/spec/orange-core/mock/mock_resource.rb +26 -0
- data/spec/orange-core/mock/mock_router.rb +10 -0
- data/spec/orange-core/orange_spec.rb +19 -0
- data/spec/orange-core/packet_spec.rb +203 -0
- data/spec/orange-core/resource_spec.rb +96 -0
- data/spec/orange-core/resources/mapper_spec.rb +5 -0
- data/spec/orange-core/resources/model_resource_spec.rb +246 -0
- data/spec/orange-core/resources/parser_spec.rb +5 -0
- data/spec/orange-core/resources/routable_resource_spec.rb +5 -0
- data/spec/orange-core/spec_helper.rb +53 -0
- data/spec/orange-core/stack_spec.rb +232 -0
- data/spec/stats.rb +182 -0
- metadata +227 -0
@@ -0,0 +1,172 @@
|
|
1
|
+
require 'orange-core/magick'
|
2
|
+
require 'orange-core/core'
|
3
|
+
module Orange::Plugins
|
4
|
+
# This class defines a basic Orange plugin. A plugin simply defines
|
5
|
+
# a bunch of possible classes/files that can be called up by the main
|
6
|
+
# orange system.
|
7
|
+
#
|
8
|
+
# The plugins are used in several places. When the core is initialized,
|
9
|
+
# it will ask all plugins if they have any resources that should be added,
|
10
|
+
# and load those resources if they exist.
|
11
|
+
#
|
12
|
+
# The stack will call the list of plugins several times in building a stack
|
13
|
+
# once for each possible middleware location.
|
14
|
+
class Base
|
15
|
+
extend ClassInheritableAttributes
|
16
|
+
cattr_accessor :prerouting_middleware, :routing_middleware,
|
17
|
+
:responder_middleware, :postrouting_middleware, :has_middleware
|
18
|
+
cattr_accessor :assets, :assets_name
|
19
|
+
cattr_accessor :resources
|
20
|
+
cattr_accessor :views
|
21
|
+
cattr_accessor :templates
|
22
|
+
|
23
|
+
# Adds a single prerouting middleware class to list of prerouting middleware
|
24
|
+
def self.prerouter(r)
|
25
|
+
prerouters(r)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Adds several prerouting middleware classes to list of prerouting middleware
|
29
|
+
def self.prerouters(*routers)
|
30
|
+
self.has_middleware = true
|
31
|
+
routers.each do |prerouter|
|
32
|
+
self.prerouting_middleware << prerouter
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# Adds a single postrouting middleware class to list of postrouting middleware
|
37
|
+
def self.postrouter(r)
|
38
|
+
postrouters(r)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Adds several postrouting middleware classes to list of postrouting middleware
|
42
|
+
def self.postrouters(*routers)
|
43
|
+
self.has_middleware = true
|
44
|
+
routers.each do |postrouter|
|
45
|
+
self.postrouting_middleware << postrouter
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Adds a router middleware class to the list of routing middleware
|
50
|
+
def self.router(r)
|
51
|
+
routers(r)
|
52
|
+
end
|
53
|
+
# Adds several router middleware classes
|
54
|
+
def self.routers(*routers)
|
55
|
+
self.has_middleware = true
|
56
|
+
routers.each do |router|
|
57
|
+
self.routing_middleware << router
|
58
|
+
end
|
59
|
+
end
|
60
|
+
# Adds a responder middleware class
|
61
|
+
def self.responder(r)
|
62
|
+
responders(r)
|
63
|
+
end
|
64
|
+
# Adds several responder middleware classes
|
65
|
+
def self.responders(*respones)
|
66
|
+
self.has_middleware = true
|
67
|
+
respones.each do |response|
|
68
|
+
self.responder_middleware << response
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# Returns the list of prerouting_middleware defined or
|
73
|
+
# an empty array if none defined
|
74
|
+
def self.prerouting_middleware
|
75
|
+
super || self.prerouting_middleware = []
|
76
|
+
end
|
77
|
+
|
78
|
+
# Returns the list of prerouting_middleware defined or
|
79
|
+
# an empty array if none defined
|
80
|
+
def self.postrouting_middleware
|
81
|
+
super || self.postrouting_middleware = []
|
82
|
+
end
|
83
|
+
|
84
|
+
# Returns the list of routing_middleware defined or
|
85
|
+
# an empty array if none defined
|
86
|
+
def self.routing_middleware
|
87
|
+
super || self.routing_middleware = []
|
88
|
+
end
|
89
|
+
|
90
|
+
# Returns the list of responder_middleware defined or
|
91
|
+
# an empty array if none defined
|
92
|
+
def self.responder_middleware
|
93
|
+
super || self.responder_middleware = []
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.templates_dir(arg)
|
97
|
+
self.templates = arg
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.views_dir(arg)
|
101
|
+
self.views = arg
|
102
|
+
end
|
103
|
+
|
104
|
+
def self.assets_dir(arg)
|
105
|
+
self.assets = arg
|
106
|
+
end
|
107
|
+
|
108
|
+
def self.resource(instance, name = false)
|
109
|
+
self.resources << [instance, name]
|
110
|
+
end
|
111
|
+
|
112
|
+
def self.resources
|
113
|
+
super || self.resources = []
|
114
|
+
end
|
115
|
+
|
116
|
+
# Returns the assigned asset dir name,
|
117
|
+
# or Plugin class name formatted like this: PluginClass -> _pluginclass_
|
118
|
+
def assets_name
|
119
|
+
self.class.assets_name || '_'+self.class.to_s.gsub(/Orange::Plugins::/, '').gsub(/::/, '_').downcase+'_'
|
120
|
+
end
|
121
|
+
|
122
|
+
# Returns the assets directory for this plugin
|
123
|
+
def assets
|
124
|
+
self.class.assets
|
125
|
+
end
|
126
|
+
|
127
|
+
# Whether this plugin has assets for the static middleware to worry
|
128
|
+
# about
|
129
|
+
def has_assets?
|
130
|
+
!assets.blank?
|
131
|
+
end
|
132
|
+
|
133
|
+
def resources
|
134
|
+
self.class.resources
|
135
|
+
end
|
136
|
+
|
137
|
+
def has_resources?
|
138
|
+
!resources.blank?
|
139
|
+
end
|
140
|
+
|
141
|
+
def views
|
142
|
+
self.class.views
|
143
|
+
end
|
144
|
+
|
145
|
+
def has_views?
|
146
|
+
!views.blank?
|
147
|
+
end
|
148
|
+
|
149
|
+
def templates
|
150
|
+
self.class.templates
|
151
|
+
end
|
152
|
+
|
153
|
+
def has_templates?
|
154
|
+
!templates.blank?
|
155
|
+
end
|
156
|
+
|
157
|
+
def middleware(type = :has)
|
158
|
+
case type
|
159
|
+
when :responders then self.class.responder_middleware
|
160
|
+
when :routing then self.class.routing_middleware
|
161
|
+
when :prerouting then self.class.prerouting_middleware
|
162
|
+
when :postrouting then self.class.postrouting_middleware
|
163
|
+
when :has then self.class.has_middleware
|
164
|
+
else nil
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
def has_middleware?
|
169
|
+
!middleware.blank?
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'orange-core/core'
|
2
|
+
|
3
|
+
module Orange
|
4
|
+
# Orange Resource for being subclassed
|
5
|
+
class Resource
|
6
|
+
extend ClassInheritableAttributes
|
7
|
+
# Defines a model class as an inheritable class attribute and also an instance
|
8
|
+
# attribute
|
9
|
+
cattr_accessor :called
|
10
|
+
|
11
|
+
def initialize(*args, &block)
|
12
|
+
@options = DefaultHash.new.merge!(Options.new(*args, &block).hash)
|
13
|
+
end
|
14
|
+
|
15
|
+
def set_orange(orange, name)
|
16
|
+
@orange = orange
|
17
|
+
@my_orange_name = name
|
18
|
+
init
|
19
|
+
orange.register(:stack_loaded) { |s| stack_init } if self.respond_to? :stack_init
|
20
|
+
self
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.set_orange(*args)
|
24
|
+
raise 'instantiate the resource before calling set orange'
|
25
|
+
end
|
26
|
+
|
27
|
+
def init
|
28
|
+
afterLoad
|
29
|
+
end
|
30
|
+
|
31
|
+
def afterLoad
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.call_me(name)
|
35
|
+
self.called = name
|
36
|
+
end
|
37
|
+
|
38
|
+
def orange
|
39
|
+
@orange
|
40
|
+
end
|
41
|
+
|
42
|
+
def routable
|
43
|
+
false
|
44
|
+
end
|
45
|
+
|
46
|
+
def view(packet = false, *args)
|
47
|
+
''
|
48
|
+
end
|
49
|
+
|
50
|
+
def orange_name
|
51
|
+
@my_orange_name || self.class.called || false
|
52
|
+
end
|
53
|
+
|
54
|
+
def options
|
55
|
+
@options
|
56
|
+
end
|
57
|
+
|
58
|
+
# Renders a view, with all options set for haml to access.
|
59
|
+
# Calls #view_opts to generate the haml options.
|
60
|
+
# @param [Orange::Packet] packet the packet we are returning a view for
|
61
|
+
# @param [Symbol] mode the mode we are trying to view (used to find template name)
|
62
|
+
# @param [optional, Array] args the args array
|
63
|
+
# @return [String] haml parsed string to be placed in packet[:content] by #route
|
64
|
+
def do_view(packet, mode, *args)
|
65
|
+
haml_opts = view_opts(packet, mode, *args)
|
66
|
+
orange[:parser].haml("#{mode.to_s}.haml", packet, haml_opts)
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
# Returns the options for including in template rendering. All keys passed in the args array
|
71
|
+
# will automatically be local variables in the haml template.
|
72
|
+
# In addition, the props, resource, and model_name variables will be available.
|
73
|
+
# @param [Orange::Packet] packet the packet we are returning a view for
|
74
|
+
# @param [Symbol] mode the mode we are trying to view (used to find template name)
|
75
|
+
# @param [boolean] is_list whether we want a list or not (view_opts will automatically look up
|
76
|
+
# a single object or a list of objects, so we need to know which)
|
77
|
+
# @param [optional, Array] args the args array
|
78
|
+
# @return [Hash] hash of options to be used
|
79
|
+
def view_opts(packet, mode, *args)
|
80
|
+
opts = args.extract_options!.with_defaults({:path => ''})
|
81
|
+
all_opts = {:resource => self, :model_name => @my_orange_name}.merge!(opts)
|
82
|
+
all_opts.with_defaults! find_extras(packet, mode)
|
83
|
+
all_opts
|
84
|
+
end
|
85
|
+
|
86
|
+
# Returns a hash of extra options to be set and made available by the haml parser.
|
87
|
+
# Overriding this method is useful for passing extra bits of info to rendering
|
88
|
+
# for certain view modes without rewriting all of the other scaffolding
|
89
|
+
# @param [Orange::Packet] packet the packet we are returning a view for
|
90
|
+
# @param [Symbol] mode the mode we are trying to view (used to find template name)
|
91
|
+
# @return [Hash] a hash of extras to be included in the rendering
|
92
|
+
def find_extras(packet, mode)
|
93
|
+
{}
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'orange-core/core'
|
2
|
+
|
3
|
+
module Orange
|
4
|
+
class Mapper < Resource
|
5
|
+
# Takes a packet extracts request information, then calls packet.route
|
6
|
+
def afterLoad
|
7
|
+
orange.add_pulp Pulp::Packet_Mapper
|
8
|
+
end
|
9
|
+
|
10
|
+
def route_to(packet, resource, *args)
|
11
|
+
opts = args.extract_options!
|
12
|
+
packet = DefaultHash.new unless packet
|
13
|
+
context = opts[:context]
|
14
|
+
context = packet['route.context', nil] unless (context || (packet['route.context'] == :live))
|
15
|
+
site = packet['route.faked_site'] ? packet['route.site_url', nil] : nil
|
16
|
+
args.unshift(resource)
|
17
|
+
args.unshift(context)
|
18
|
+
args.unshift(site)
|
19
|
+
'/'+args.compact.join('/')
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module Pulp::Packet_Mapper
|
24
|
+
def route_to(resource, *args)
|
25
|
+
orange[:mapper].route_to(self, resource, *args)
|
26
|
+
end
|
27
|
+
|
28
|
+
def reroute(url, type = :real, *args)
|
29
|
+
packet['reroute.to'] = url
|
30
|
+
packet['reroute.type'] = type
|
31
|
+
packet['reroute.args'] = *args if args
|
32
|
+
raise Reroute.new(self), 'Unhandled reroute'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,228 @@
|
|
1
|
+
require 'orange-core/resources/routable_resource'
|
2
|
+
|
3
|
+
module Orange
|
4
|
+
class ModelResource < RoutableResource
|
5
|
+
# Defines a model class as an inheritable class attribute and also an instance
|
6
|
+
# attribute
|
7
|
+
cattr_accessor :model_class
|
8
|
+
attr_accessor :model_class
|
9
|
+
|
10
|
+
# Tells the Model resource which Carton class to scaffold
|
11
|
+
# @param [Orange::Carton] my_model_class class name of the carton class to scaffold
|
12
|
+
def self.use(my_model_class)
|
13
|
+
self.model_class = my_model_class
|
14
|
+
end
|
15
|
+
|
16
|
+
# Overrides the instantiation of new Resource object to set instance model
|
17
|
+
# class to the class-level model class defined by #use
|
18
|
+
def self.new(*args, &block)
|
19
|
+
me = super(*args, &block)
|
20
|
+
me.model_class = self.model_class
|
21
|
+
me
|
22
|
+
end
|
23
|
+
|
24
|
+
# Views a packet by calling method defined as opts[:mode].
|
25
|
+
# Defaults mode to show or list, if it can't find opts[:mode].
|
26
|
+
# Decision between show or list is determined by whether an id has been chosen.
|
27
|
+
# An id is set in opts[:id], or extracted from the packet['route.resource_id'].
|
28
|
+
# Calling view is equivalent to calling a viewable method directly, view just
|
29
|
+
# sets up safe defaults so method missing errors are less likely.
|
30
|
+
# @param [Orange::Packet] packet the packet calling view on this resource
|
31
|
+
def view(packet, opts = {})
|
32
|
+
resource_id = opts[:id] || packet['route.resource_id', false]
|
33
|
+
mode = opts[:mode] || packet['route.resource_action'] ||
|
34
|
+
(resource_id ? :show : :index)
|
35
|
+
self.__send__(mode, packet, opts)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Renders a view, with all options set for haml to access.
|
39
|
+
# Calls #view_opts to generate the haml options.
|
40
|
+
# @param [Orange::Packet] packet the packet we are returning a view for
|
41
|
+
# @param [Symbol] mode the mode we are trying to view (used to find template name)
|
42
|
+
# @param [optional, Array] args the args array
|
43
|
+
# @return [String] haml parsed string to be placed in packet[:content] by #route
|
44
|
+
def do_view(packet, mode, *args)
|
45
|
+
haml_opts = view_opts(packet, mode, false, *args)
|
46
|
+
orange[:parser].haml("#{mode.to_s}.haml", packet, haml_opts)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Renders a view, with all options set for haml to access. Same as do_view, but
|
50
|
+
# calls #view_opts with is_list set to true to generate the haml options.
|
51
|
+
# @param [Orange::Packet] packet the packet we are returning a view for
|
52
|
+
# @param [Symbol] mode the mode we are trying to view (used to find template name)
|
53
|
+
# @param [optional, Array] args the args array
|
54
|
+
# @return [String] haml parsed string to be placed in packet[:content] by #route
|
55
|
+
def do_list_view(packet, mode, *args)
|
56
|
+
haml_opts = view_opts(packet, mode, true, *args)
|
57
|
+
orange[:parser].haml("#{mode.to_s}.haml", packet, haml_opts)
|
58
|
+
end
|
59
|
+
|
60
|
+
# Returns the options for including in template rendering. All keys passed in the args array
|
61
|
+
# will automatically be local variables in the haml template.
|
62
|
+
# In addition, the props, resource, and model_name variables will be available.
|
63
|
+
# @param [Orange::Packet] packet the packet we are returning a view for
|
64
|
+
# @param [Symbol] mode the mode we are trying to view (used to find template name)
|
65
|
+
# @param [boolean] is_list whether we want a list or not (view_opts will automatically look up
|
66
|
+
# a single object or a list of objects, so we need to know which)
|
67
|
+
# @param [optional, Array] args the args array
|
68
|
+
# @return [Hash] hash of options to be used
|
69
|
+
def view_opts(packet, mode, is_list, *args)
|
70
|
+
opts = args.extract_options!.with_defaults({:path => ''})
|
71
|
+
props = model_class.form_props(packet['route.context'])
|
72
|
+
resource_id = opts[:id] || packet['route.resource_id'] || false
|
73
|
+
all_opts = {:props => props, :resource => self, :model_name => @my_orange_name}.merge!(opts)
|
74
|
+
all_opts.with_defaults! :model => find_one(packet, mode, resource_id) unless is_list
|
75
|
+
all_opts.with_defaults! :list => find_list(packet, mode) if is_list
|
76
|
+
all_opts.with_defaults! find_extras(packet, mode)
|
77
|
+
all_opts
|
78
|
+
end
|
79
|
+
|
80
|
+
# Returns a single object found by the model class, given an id.
|
81
|
+
# If id isn't given, we return false.
|
82
|
+
# @param [Orange::Packet] packet the packet we are returning a view for
|
83
|
+
# @param [Symbol] mode the mode we are trying to view (used to find template name)
|
84
|
+
# @param [Numeric] id the id to lookup on the model class
|
85
|
+
# @return [Object] returns an object of type set by #use, if one found with same id
|
86
|
+
def find_one(packet, mode, id = false)
|
87
|
+
return false unless id
|
88
|
+
model_class.get(id)
|
89
|
+
end
|
90
|
+
|
91
|
+
# Returns a list of all objects found by the model class
|
92
|
+
# If none, returns an empty array
|
93
|
+
# @param [Orange::Packet] packet the packet we are returning a view for
|
94
|
+
# @param [Symbol] mode the mode we are trying to view (used to find template name)
|
95
|
+
# @param [Numeric] id the id to lookup on the model class
|
96
|
+
# @return [Enumerable] returns a collection of objects of type set by #use
|
97
|
+
def find_list(packet, mode)
|
98
|
+
model_class.all || []
|
99
|
+
end
|
100
|
+
|
101
|
+
# Creates a new model object and saves it (if a post), then reroutes to the main page
|
102
|
+
# @param [Orange::Packet] packet the packet being routed
|
103
|
+
def new(packet, opts = {})
|
104
|
+
no_reroute = opts.delete(:no_reroute)
|
105
|
+
if packet.request.post? || !opts.blank?
|
106
|
+
params = opts.with_defaults(opts.delete(:params) || packet.request.params[@my_orange_name.to_s] || {})
|
107
|
+
before = beforeNew(packet, params)
|
108
|
+
obj = onNew(packet, params) if before
|
109
|
+
afterNew(packet, obj, params) if before
|
110
|
+
obj.save if obj && before
|
111
|
+
end
|
112
|
+
packet.reroute(@my_orange_name, :orange) unless (packet.request.xhr? || no_reroute)
|
113
|
+
obj || false
|
114
|
+
end
|
115
|
+
|
116
|
+
# A callback for the actual new item event
|
117
|
+
def onNew(packet, opts = {})
|
118
|
+
model_class.new(opts)
|
119
|
+
end
|
120
|
+
|
121
|
+
# A callback for before a new item is created
|
122
|
+
# @param [Orange::Packet] packet the packet being routed
|
123
|
+
def beforeNew(packet, opts = {})
|
124
|
+
true
|
125
|
+
end
|
126
|
+
|
127
|
+
# A callback for after a new item is created
|
128
|
+
# @param [Orange::Packet] packet the packet being routed
|
129
|
+
# @param [Object] obj the model class just created
|
130
|
+
def afterNew(packet, obj, opts = {})
|
131
|
+
end
|
132
|
+
|
133
|
+
# Deletes an object specified by packet['route.resource_id'], then reroutes to main.
|
134
|
+
# The request must come in as a delete. Rack::MethodOverride can be used to do this.
|
135
|
+
# @param [Orange::Packet] packet the packet being routed
|
136
|
+
def delete(packet, opts = {})
|
137
|
+
no_reroute = opts.delete(:no_reroute)
|
138
|
+
if packet.request.delete? || !opts.blank?
|
139
|
+
id = opts.delete(:resource_id) || packet['route.resource_id']
|
140
|
+
m = model_class.get(packet['route.resource_id'])
|
141
|
+
before = beforeDelete(packet, m, opts)
|
142
|
+
onDelete(packet, m, opts) if m && before
|
143
|
+
afterDelete(packet, m, opts) if before
|
144
|
+
orange.fire(:model_resource_deleted, packet, {:resource_id => id, :resource => @my_orange_name})
|
145
|
+
end
|
146
|
+
packet.reroute(@my_orange_name, :orange) unless (packet.request.xhr? || no_reroute)
|
147
|
+
end
|
148
|
+
|
149
|
+
def beforeDelete(packet, obj, opts = {})
|
150
|
+
true
|
151
|
+
end
|
152
|
+
|
153
|
+
# Delete object
|
154
|
+
def onDelete(packet, obj, opts = {})
|
155
|
+
obj.destroy
|
156
|
+
end
|
157
|
+
|
158
|
+
def afterDelete(packet, obj, opts = {})
|
159
|
+
end
|
160
|
+
|
161
|
+
# Saves updates to an object specified by packet['route.resource_id'], then reroutes to main
|
162
|
+
# @param [Orange::Packet] packet the packet being routed
|
163
|
+
def save(packet, opts = {})
|
164
|
+
no_reroute = opts.delete(:no_reroute)
|
165
|
+
if packet.request.post? || !opts.blank?
|
166
|
+
my_id = opts.delete(:resource_id) || packet['route.resource_id']
|
167
|
+
m = opts.delete(:model) || model_class.get(my_id)
|
168
|
+
params = opts.with_defaults(opts.delete(:params) || packet.request.params[@my_orange_name.to_s] || {})
|
169
|
+
if m
|
170
|
+
before = beforeSave(packet, m, params)
|
171
|
+
onSave(packet, m, params) if before
|
172
|
+
afterSave(packet, m, params) if before
|
173
|
+
end
|
174
|
+
end
|
175
|
+
packet.reroute(@my_orange_name, :orange) unless (packet.request.xhr? || no_reroute)
|
176
|
+
m || false
|
177
|
+
end
|
178
|
+
|
179
|
+
def beforeSave(packet, obj, opts = {})
|
180
|
+
true
|
181
|
+
end
|
182
|
+
|
183
|
+
def onSave(packet, obj, opts = {})
|
184
|
+
obj.update(opts)
|
185
|
+
end
|
186
|
+
|
187
|
+
def afterSave(packet, obj, opts = {})
|
188
|
+
end
|
189
|
+
|
190
|
+
# Calls #do_view with :show mode
|
191
|
+
# @param [Orange::Packet] packet the packet being routed
|
192
|
+
def show(packet, *opts)
|
193
|
+
do_view(packet, :show, *opts)
|
194
|
+
end
|
195
|
+
|
196
|
+
# Calls #do_view with :edit mode
|
197
|
+
# @param [Orange::Packet] packet the packet being routed
|
198
|
+
def edit(packet, *opts)
|
199
|
+
do_view(packet, :edit, *opts)
|
200
|
+
end
|
201
|
+
|
202
|
+
# Calls #do_view with :create mode
|
203
|
+
# @param [Orange::Packet] packet the packet being routed
|
204
|
+
def create(packet, *opts)
|
205
|
+
do_view(packet, :create, *opts)
|
206
|
+
end
|
207
|
+
|
208
|
+
# Calls #do_view with :table_row mode
|
209
|
+
# @param [Orange::Packet] packet the packet being routed
|
210
|
+
def table_row(packet, *opts)
|
211
|
+
do_view(packet, :table_row, *opts)
|
212
|
+
end
|
213
|
+
|
214
|
+
# Calls #do_list_view with :list mode
|
215
|
+
# @param [Orange::Packet] packet the packet being routed
|
216
|
+
def list(packet, *opts)
|
217
|
+
do_list_view(packet, :list, *opts)
|
218
|
+
end
|
219
|
+
|
220
|
+
# Calls #do_list_view with :list mode.
|
221
|
+
# @param [Orange::Packet] packet the packet being routed
|
222
|
+
def index(packet, *opts)
|
223
|
+
do_list_view(packet, :list, *opts)
|
224
|
+
end
|
225
|
+
|
226
|
+
end
|
227
|
+
|
228
|
+
end
|