orange 0.3.1 → 0.3.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/lib/orange-core/carton.rb +5 -0
- data/lib/orange-core/core.rb +1 -0
- data/lib/orange-core/middleware/template.rb +2 -1
- data/lib/orange-core/resources/model_resource.rb +0 -77
- data/lib/orange-core/resources/scaffold.rb +106 -0
- data/lib/orange-core/views/default_resource/edit.haml +1 -1
- data/lib/orange-core/views/default_resource/show.haml +1 -1
- data/lib/orange-more/administration/middleware/access_control.rb +8 -0
- data/lib/orange-more/administration/resources/user_resource.rb +1 -1
- data/lib/orange-more/adverts/cartons/adverts_carton.rb +1 -1
- data/lib/orange-more/assets/cartons/asset_carton.rb +26 -22
- data/lib/orange-more/assets/resources/asset_resource.rb +56 -2
- data/lib/orange-more/assets/views/assets/change.haml +1 -0
- data/lib/orange-more/assets/views/assets/insert.haml +1 -0
- data/lib/orange-more/debugger/middleware/debugger.rb +8 -0
- data/lib/orange-more/debugger/views/debug_bar.haml +4 -0
- data/lib/orange-more/events/resources/event_resource.rb +4 -1
- data/lib/orange-more/members/resources/members_resource.rb +2 -1
- data/lib/orange-more/news/cartons/news.rb +1 -1
- data/lib/orange-more/pages/cartons/page_carton.rb +1 -1
- data/lib/orange-more/pages/cartons/page_version_carton.rb +1 -1
- data/lib/orange-more/pages/resources/page_resource.rb +34 -13
- data/lib/orange-more/sitemap/cartons/route.rb +2 -2
- data/lib/orange-more/sitemap/resources/sitemap_resource.rb +31 -0
- data/lib/orange-more/sitemap/views/sitemap/one_level.haml +1 -1
- data/lib/orange-more/sitemap/views/sitemap/table_row.haml +1 -1
- data/lib/orange-more/sitemap/views/sitemap/two_level.haml +3 -2
- data/lib/orange-more/subsites/resources/subsite_resource.rb +2 -2
- metadata +6 -3
data/lib/orange-core/carton.rb
CHANGED
data/lib/orange-core/core.rb
CHANGED
@@ -72,6 +72,7 @@ module Orange
|
|
72
72
|
@file = __FILE__
|
73
73
|
load(Orange::Parser.new, :parser)
|
74
74
|
load(Orange::Mapper.new, :mapper)
|
75
|
+
load(Orange::Scaffold.new, :scaffold)
|
75
76
|
load(Orange::PageParts.new, :page_parts)
|
76
77
|
Orange.plugins.each{|p| p.resources.each{|args| load(*args)} if p.has_resources?}
|
77
78
|
self.register(:stack_loaded) do |s|
|
@@ -23,7 +23,8 @@ module Orange::Middleware
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def needs_wrapped?(packet)
|
26
|
-
packet
|
26
|
+
return false if packet.request.xhr? && !packet['template.enable'] # don't wrap xhr unless specifically asked to
|
27
|
+
packet['template.file'] && !packet['template.disable']
|
27
28
|
end
|
28
29
|
|
29
30
|
def wrap(packet, content = false)
|
@@ -223,81 +223,4 @@ module Orange
|
|
223
223
|
|
224
224
|
end
|
225
225
|
|
226
|
-
class Packet
|
227
|
-
# Adds view_[mode_name] magic methods to the packet
|
228
|
-
meta_methods(/view_([a-zA-Z_]+)/) do |packet, match, args|
|
229
|
-
model = args.shift
|
230
|
-
args = args.extract_with_defaults(:mode => match[1].to_sym)
|
231
|
-
packet.view(model, args)
|
232
|
-
end
|
233
|
-
|
234
|
-
# Creates a button that appears to be a link but
|
235
|
-
# does form submission with custom method (_method param in POST)
|
236
|
-
# This is to avoid issues of a destructive get.
|
237
|
-
# @param [String] text link text to show
|
238
|
-
# @param [String] link the actual href value of the link
|
239
|
-
# @param [String, false] confirm text of the javascript confirm (false for none [default])
|
240
|
-
# @param [optional, Array] args array of optional arguments, only opts[:method] defined
|
241
|
-
# @option opts [String] method method name (Should be 'DELETE', 'PUT' or 'POST')
|
242
|
-
def form_link(text, link, confirm = false, opts = {})
|
243
|
-
text = "<img src='#{opts[:img]}' alt='#{text}' />" if opts[:img]
|
244
|
-
css = opts[:class]? opts[:class] : 'form_button_link'
|
245
|
-
meth = (opts[:method]? "<input type='hidden' name='_method' value='#{opts[:method]}' />" : '')
|
246
|
-
if confirm
|
247
|
-
"<form action='#{link}' method='post' class='mini' onsubmit='return confirm(\"#{confirm}\")'><button class='link_button'><a href='#' class='#{css}'>#{text}</a></button>#{meth}</form>"
|
248
|
-
else
|
249
|
-
"<form action='#{link}' method='post' class='mini'><button class='link_button'><a href='#' class='#{css}'>#{text}</a></button>#{meth}</form>"
|
250
|
-
end
|
251
|
-
end
|
252
|
-
|
253
|
-
# Calls view for an orange resource.
|
254
|
-
def view(model_name, *args)
|
255
|
-
orange[model_name].view(self, *args)
|
256
|
-
end
|
257
|
-
|
258
|
-
# Returns a scaffolded attribute
|
259
|
-
def view_attribute(prop, model_name, *args)
|
260
|
-
args = args.extract_options!
|
261
|
-
val = (args[:value] || '')
|
262
|
-
label = args[:label] || false
|
263
|
-
show = args[:show] || false
|
264
|
-
name = prop[:name]
|
265
|
-
human_readable_name = name.to_s.split('_').each{|w| w.capitalize!}.join(' ')
|
266
|
-
unless show
|
267
|
-
case prop[:type]
|
268
|
-
when :title
|
269
|
-
val.gsub!('"', '"')
|
270
|
-
ret = "<input class=\"title\" type=\"text\" value=\"#{val}\" name=\"#{model_name}[#{name}]\" />"
|
271
|
-
when :text
|
272
|
-
val.gsub!('"', '"')
|
273
|
-
ret = "<input type=\"text\" value=\"#{val}\" name=\"#{model_name}[#{name}]\" />"
|
274
|
-
when :fulltext
|
275
|
-
ret = "<textarea name='#{model_name}[#{name}]'>#{val}</textarea>"
|
276
|
-
when :boolean
|
277
|
-
human_readable_name = human_readable_name + '?'
|
278
|
-
ret = "<input type='hidden' name='#{model_name}[#{name}]' value='0' /><input type='checkbox' name='#{model_name}[#{name}]' value='1' #{'checked="checked"' if (val && val != '')}/>"
|
279
|
-
when :date
|
280
|
-
val.gsub!('"', '"')
|
281
|
-
ret = "<input class=\"date\" type=\"text\" value=\"#{val}\" name=\"#{model_name}[#{name}]\" />"
|
282
|
-
else
|
283
|
-
val.gsub!('"', '"')
|
284
|
-
ret = "<input type=\"text\" value=\"#{val}\" name=\"#{model_name}[#{name}]\" />"
|
285
|
-
end
|
286
|
-
display_name = prop[:display_name] || human_readable_name
|
287
|
-
ret = "<label for=''>#{display_name}</label><br />" + ret if label
|
288
|
-
else
|
289
|
-
case prop[:type]
|
290
|
-
when :title
|
291
|
-
ret = "<h3 class='#{model_name}-#{name}'>#{val}</h3>"
|
292
|
-
when :text
|
293
|
-
ret = "<p class='#{model_name}-#{name}'>#{val}</p>"
|
294
|
-
when :fulltext
|
295
|
-
ret = "<div class='#{model_name}-#{name}'>#{val}</div>"
|
296
|
-
else
|
297
|
-
ret = "<div class='#{model_name}-#{name}'>#{val}</div>"
|
298
|
-
end
|
299
|
-
end
|
300
|
-
return ret
|
301
|
-
end
|
302
|
-
end
|
303
226
|
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'orange-core/core'
|
2
|
+
|
3
|
+
module Orange
|
4
|
+
class Scaffold < Resource
|
5
|
+
# Load the scaffold helpers
|
6
|
+
def afterLoad
|
7
|
+
orange.add_pulp Pulp::ScaffoldHelpers
|
8
|
+
Packet.meta_methods(/view_([a-zA-Z_]+)/) do |packet, match, args|
|
9
|
+
model = args.shift
|
10
|
+
args = args.extract_with_defaults(:mode => match[1].to_sym)
|
11
|
+
packet.view(model, args)
|
12
|
+
end
|
13
|
+
@scaffold_types = {}
|
14
|
+
add_scaffold_type(:boolean) do |name, val, opts|
|
15
|
+
if opts[:show]
|
16
|
+
val ? "true" : "false"
|
17
|
+
else
|
18
|
+
ret = "<input type='hidden' name='#{opts[:model_name]}[#{name}]' value='0' /><input type='checkbox' name='#{opts[:model_name]}[#{name}]' value='1' #{'checked="checked"' if (val && val != '')}/>"
|
19
|
+
ret = "<label for=''>#{opts[:display_name]}</label><br />" + ret if opts[:label]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def add_scaffold_type(type, &block)
|
25
|
+
@scaffold_types[type] = Proc.new
|
26
|
+
end
|
27
|
+
|
28
|
+
def scaffold_attribute(packet, prop, model_name, *args)
|
29
|
+
args = args.extract_options!
|
30
|
+
args.with_defaults!({:packet => packet, :value => '', :label => false, :show => false})
|
31
|
+
val = args[:value]
|
32
|
+
label = args[:label]
|
33
|
+
show = args[:show]
|
34
|
+
name = prop[:name]
|
35
|
+
human_readable_name = name.to_s.split('_').each{|w| w.capitalize!}.join(' ')
|
36
|
+
display_name = prop[:display_name] || human_readable_name
|
37
|
+
return @scaffold_types[prop[:type]].call(name, val, args.with_defaults!(:display_name => display_name, :model_name => model_name)) if @scaffold_types.has_key?(prop[:type])
|
38
|
+
unless show
|
39
|
+
case prop[:type]
|
40
|
+
when :title
|
41
|
+
val.gsub!('"', '"')
|
42
|
+
ret = "<input class=\"title\" type=\"text\" value=\"#{val}\" name=\"#{model_name}[#{name}]\" />"
|
43
|
+
when :text
|
44
|
+
val.gsub!('"', '"')
|
45
|
+
ret = "<input type=\"text\" value=\"#{val}\" name=\"#{model_name}[#{name}]\" />"
|
46
|
+
when :fulltext
|
47
|
+
ret = "<textarea name='#{model_name}[#{name}]'>#{val}</textarea>"
|
48
|
+
when :boolean
|
49
|
+
human_readable_name = human_readable_name + '?'
|
50
|
+
ret = "<input type='hidden' name='#{model_name}[#{name}]' value='0' /><input type='checkbox' name='#{model_name}[#{name}]' value='1' #{'checked="checked"' if (val && val != '')}/>"
|
51
|
+
when :date
|
52
|
+
val.gsub!('"', '"')
|
53
|
+
ret = "<input class=\"date\" type=\"text\" value=\"#{val}\" name=\"#{model_name}[#{name}]\" />"
|
54
|
+
else
|
55
|
+
val.gsub!('"', '"')
|
56
|
+
ret = "<input type=\"text\" value=\"#{val}\" name=\"#{model_name}[#{name}]\" />"
|
57
|
+
end
|
58
|
+
ret = "<label for=''>#{display_name}</label><br />" + ret if label
|
59
|
+
else
|
60
|
+
case prop[:type]
|
61
|
+
when :title
|
62
|
+
ret = "<h3 class='#{model_name}-#{name}'>#{val}</h3>"
|
63
|
+
when :text
|
64
|
+
ret = "<p class='#{model_name}-#{name}'>#{val}</p>"
|
65
|
+
when :fulltext
|
66
|
+
ret = "<div class='#{model_name}-#{name}'>#{val}</div>"
|
67
|
+
else
|
68
|
+
ret = "<div class='#{model_name}-#{name}'>#{val}</div>"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
return ret
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
module Pulp::ScaffoldHelpers
|
76
|
+
# Creates a button that appears to be a link but
|
77
|
+
# does form submission with custom method (_method param in POST)
|
78
|
+
# This is to avoid issues of a destructive get.
|
79
|
+
# @param [String] text link text to show
|
80
|
+
# @param [String] link the actual href value of the link
|
81
|
+
# @param [String, false] confirm text of the javascript confirm (false for none [default])
|
82
|
+
# @param [optional, Array] args array of optional arguments, only opts[:method] defined
|
83
|
+
# @option opts [String] method method name (Should be 'DELETE', 'PUT' or 'POST')
|
84
|
+
def form_link(text, link, confirm = false, opts = {})
|
85
|
+
text = "<img src='#{opts[:img]}' alt='#{text}' />" if opts[:img]
|
86
|
+
css = opts[:class]? opts[:class] : 'form_button_link'
|
87
|
+
meth = (opts[:method]? "<input type='hidden' name='_method' value='#{opts[:method]}' />" : '')
|
88
|
+
if confirm
|
89
|
+
"<form action='#{link}' method='post' class='mini' onsubmit='return confirm(\"#{confirm}\")'><button class='link_button'><a href='#' class='#{css}'>#{text}</a></button>#{meth}</form>"
|
90
|
+
else
|
91
|
+
"<form action='#{link}' method='post' class='mini'><button class='link_button'><a href='#' class='#{css}'>#{text}</a></button>#{meth}</form>"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# Calls view for an orange resource.
|
96
|
+
def view(model_name, *args)
|
97
|
+
orange[model_name].view(self, *args)
|
98
|
+
end
|
99
|
+
|
100
|
+
# Returns a scaffolded attribute
|
101
|
+
def view_attribute(prop, model_name, *args)
|
102
|
+
orange[:scaffold].scaffold_attribute(self, prop, model_name, *args)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
= orange[:sitemap, true].sitemap_links(packet, {:slug_me => orange[:sitemap, true].slug_for(model, props)})
|
4
4
|
%form{:action => packet.route_to(model_name, model[:id], 'save'), :method => 'post'}
|
5
5
|
- for prop in props
|
6
|
-
%p!= view_attribute(prop, model_name, :label => true, :value => model.attribute_get(prop[:name]))
|
6
|
+
%p!= view_attribute(prop, model_name, :label => true, :value => model.attribute_get(prop[:name]), :model => model)
|
7
7
|
%input{:type => 'submit', :value => 'Save Changes'}
|
8
8
|
- else
|
9
9
|
%p Couldn't find the item you're looking for.
|
@@ -38,6 +38,14 @@ module Orange::Middleware
|
|
38
38
|
return ret unless ret.blank? # unless handle_openid returns false, exit immediately
|
39
39
|
end
|
40
40
|
unless access_allowed?(packet)
|
41
|
+
if packet['user'] && packet['route.context'] == :admin
|
42
|
+
# User doesn't have permissions, try to get to a site that he does
|
43
|
+
site = packet['user'].orange_sites.first
|
44
|
+
if site.class.to_s == "OrangeSubsite"
|
45
|
+
subsite = orange[:sitemap].url_for(packet, {:resource => 'subsites', :resource_id => site.id})
|
46
|
+
packet.reroute("/admin#{subsite}sitemap")
|
47
|
+
end
|
48
|
+
end
|
41
49
|
packet.flash['user.after_login'] = packet.request.path
|
42
50
|
packet.reroute(@login)
|
43
51
|
end
|
@@ -28,7 +28,7 @@ module Orange
|
|
28
28
|
def onSave(packet, obj, params ={})
|
29
29
|
sites = params.delete 'sites'
|
30
30
|
obj.update(params)
|
31
|
-
obj.orange_sites
|
31
|
+
obj.orange_sites = []
|
32
32
|
sites.each{|k,v| s = OrangeSite.first(:id => k); obj.orange_sites << s if s} if sites
|
33
33
|
obj.save
|
34
34
|
end
|
@@ -1,23 +1,27 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
text :caption
|
7
|
-
end
|
8
|
-
orange do
|
9
|
-
string :path, :length => 255
|
10
|
-
string :mime_type
|
11
|
-
string :secondary_path, :length => 255, :required => false
|
12
|
-
string :secondary_mime_type
|
13
|
-
end
|
14
|
-
|
15
|
-
def file_path
|
16
|
-
File.join('', 'assets', 'uploaded', path)
|
17
|
-
end
|
18
|
-
|
19
|
-
def to_asset_tag(alt = "")
|
20
|
-
"<img src=\"#{file_path}\" border=\"0\" alt=\"#{alt}\"/>"
|
21
|
-
end
|
1
|
+
class OrangeAsset < Orange::Carton
|
2
|
+
id
|
3
|
+
admin do
|
4
|
+
title :name, :length => 255
|
5
|
+
text :caption, :length => 255
|
22
6
|
end
|
23
|
-
|
7
|
+
orange do
|
8
|
+
string :path, :length => 255
|
9
|
+
string :mime_type
|
10
|
+
string :secondary_path, :length => 255, :required => false
|
11
|
+
string :secondary_mime_type
|
12
|
+
end
|
13
|
+
|
14
|
+
def file_path
|
15
|
+
File.join('', 'assets', 'uploaded', path)
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
<<-DOC
|
20
|
+
{"id": #{self.id}, "html": "#{self.to_asset_tag}"}
|
21
|
+
DOC
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_asset_tag(alt = "")
|
25
|
+
"<img src='#{file_path}' border='0' alt='#{alt}' />"
|
26
|
+
end
|
27
|
+
end
|
@@ -1,7 +1,15 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
module Orange
|
3
|
+
class Orange::Carton
|
4
|
+
# Define a helper for input type="text" type database stuff
|
5
|
+
# Show in a context if wrapped in one of the helpers
|
6
|
+
def self.asset(name, opts = {})
|
7
|
+
add_scaffold(name, :asset, Integer, opts)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
3
11
|
class AssetResource < Orange::ModelResource
|
4
|
-
use
|
12
|
+
use OrangeAsset
|
5
13
|
call_me :assets
|
6
14
|
|
7
15
|
def stack_init
|
@@ -13,6 +21,22 @@ module Orange
|
|
13
21
|
''
|
14
22
|
end
|
15
23
|
end
|
24
|
+
orange[:scaffold].add_scaffold_type(:asset) do |name, val, opts|
|
25
|
+
if opts[:show]
|
26
|
+
opts[:model].to_asset_tag
|
27
|
+
else
|
28
|
+
packet = opts[:packet]
|
29
|
+
|
30
|
+
asset_html = val ? orange[:assets].asset_html(packet, val) : ""
|
31
|
+
ret = "<input type=\"hidden\" value=\"#{val}\" name=\"#{opts[:model_name]}[#{name}]\" />"
|
32
|
+
if val.blank?
|
33
|
+
ret += "<span class='asset_preview'></span><a class='insert_asset' rel=\"#{opts[:model_name]}[#{name}]\" href='/admin/assets/insert'>Insert Asset</a>"
|
34
|
+
else
|
35
|
+
ret += "<span class='asset_preview'>#{asset_html}</span><a class='insert_asset' rel=\"#{opts[:model_name]}[#{name}]\" href='/admin/assets/#{val}/change'>Change Asset</a>"
|
36
|
+
end
|
37
|
+
ret = "<label for=''>#{opts[:display_name]}</label><br />" + ret if opts[:label]
|
38
|
+
end
|
39
|
+
end
|
16
40
|
end
|
17
41
|
|
18
42
|
def onNew(packet, params = {})
|
@@ -41,6 +65,35 @@ module Orange
|
|
41
65
|
m
|
42
66
|
end
|
43
67
|
|
68
|
+
# Creates a new model object and saves it (if a post), then reroutes to the main page
|
69
|
+
# @param [Orange::Packet] packet the packet being routed
|
70
|
+
def new(packet, opts = {})
|
71
|
+
no_reroute = opts.delete(:no_reroute)
|
72
|
+
xhr = packet.request.xhr? || packet.request.params["fake_xhr"]
|
73
|
+
if packet.request.post? || !opts.blank?
|
74
|
+
params = opts.with_defaults(opts.delete(:params) || packet.request.params[@my_orange_name.to_s] || {})
|
75
|
+
before = beforeNew(packet, params)
|
76
|
+
obj = onNew(packet, params) if before
|
77
|
+
afterNew(packet, obj, params) if before
|
78
|
+
obj.save if obj && before
|
79
|
+
end
|
80
|
+
packet.reroute(@my_orange_name, :orange) unless (xhr || no_reroute)
|
81
|
+
packet['template.disable'] = true if xhr
|
82
|
+
(xhr ? obj.to_s : obj) || false
|
83
|
+
end
|
84
|
+
|
85
|
+
def insert(packet, opts = {})
|
86
|
+
do_view(packet, :insert, opts)
|
87
|
+
end
|
88
|
+
|
89
|
+
def change(packet, opts = {})
|
90
|
+
do_view(packet, :change, opts)
|
91
|
+
end
|
92
|
+
|
93
|
+
def find_extras(packet, mode, opts = {})
|
94
|
+
{:list => model_class.all}
|
95
|
+
end
|
96
|
+
|
44
97
|
def onDelete(packet, m, opts = {})
|
45
98
|
begin
|
46
99
|
FileUtils.rm(orange.app_dir('assets','uploaded', m.path)) if m.path
|
@@ -51,7 +104,8 @@ module Orange
|
|
51
104
|
m.destroy if m
|
52
105
|
end
|
53
106
|
|
54
|
-
def asset_html(packet, id)
|
107
|
+
def asset_html(packet, id = false)
|
108
|
+
id ||= packet['route.resource_id']
|
55
109
|
m = model_class.get(id)
|
56
110
|
m ? m.to_asset_tag : false
|
57
111
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
%h2 Change an Asset
|
@@ -0,0 +1 @@
|
|
1
|
+
%h2 Insert an Asset
|
@@ -4,6 +4,7 @@ module Orange::Middleware
|
|
4
4
|
class Debugger < Base
|
5
5
|
def init(opts = {})
|
6
6
|
orange.add_pulp Orange::Pulp::DebuggerHelpers if orange.options[:development_mode]
|
7
|
+
orange.mixin Orange::Mixins::DebuggerMixin if orange.options[:development_mode]
|
7
8
|
end
|
8
9
|
|
9
10
|
# Passes packet then parses the return
|
@@ -34,6 +35,13 @@ module Orange::Pulp::DebuggerHelpers
|
|
34
35
|
end
|
35
36
|
end
|
36
37
|
|
38
|
+
|
39
|
+
module Orange::Mixins::DebuggerMixin
|
40
|
+
def resources
|
41
|
+
@resources
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
37
45
|
class Rack::Builder
|
38
46
|
def inspect
|
39
47
|
"#<Rack::Builder:#{self.object_id.to_s(16)} @ins=#{@ins.map{|x| x.instance_of?(Proc)? x.call(nil) : x }.inspect} >"
|
@@ -33,7 +33,7 @@ module Orange
|
|
33
33
|
ev_json = {} if ev
|
34
34
|
ev.each{|v| ev_json[v.id] = v.attributes.merge(:id => v.id)} if ev
|
35
35
|
ee_json = {} if ee
|
36
|
-
ee.each{|v| ee_json[v.id] = v.attributes.merge(:id => v.id)} if ee
|
36
|
+
ee.each{|v| ee_json[v.id] = v.attributes.merge(:id => v.id).reject{|k,v| [:venue, :organizer].include? k}} if ee
|
37
37
|
extras.merge!(:eventbrite_venues => ev, :venues_json => ev_json.to_json,
|
38
38
|
:eventbrite_events => ee, :events_json => ee_json.to_json
|
39
39
|
) if options[:eventbrite_key]
|
@@ -116,6 +116,9 @@ module Orange
|
|
116
116
|
venue.save
|
117
117
|
end
|
118
118
|
|
119
|
+
def find_list(packet, mode, opts = {})
|
120
|
+
model_class.all(:order => [:starts.desc]) || []
|
121
|
+
end
|
119
122
|
|
120
123
|
def post_to_eventbrite
|
121
124
|
|
@@ -145,8 +145,8 @@ module Orange
|
|
145
145
|
params = packet.request.params["members"]
|
146
146
|
login = params["login_email"]
|
147
147
|
password = params["login_password"]
|
148
|
-
tester = model_class.new({:password => password})
|
149
148
|
member = model_class.first({:email => login})
|
149
|
+
tester = model_class.new({:password => password, :salt => member.salt})
|
150
150
|
if member && tester.hashed_password == member.hashed_password
|
151
151
|
packet.session["member"] = member.id
|
152
152
|
packet.reroute(@my_orange_name, :orange, :profile)
|
@@ -155,6 +155,7 @@ module Orange
|
|
155
155
|
do_view(packet, :login, opts)
|
156
156
|
end
|
157
157
|
else
|
158
|
+
packet.reroute(@my_orange_name, :orange, :profile) if packet.session["member"]
|
158
159
|
do_view(packet, :login, opts)
|
159
160
|
end
|
160
161
|
end
|
@@ -37,7 +37,7 @@ module Orange
|
|
37
37
|
no_reroute = opts[:no_reroute]
|
38
38
|
if packet.request.post? || !opts.blank?
|
39
39
|
my_id = opts[:resource_id] || packet['route.resource_id']
|
40
|
-
m = model_class.get(my_id)
|
40
|
+
m = opts[:model] || model_class.get(my_id)
|
41
41
|
if m
|
42
42
|
params = {}
|
43
43
|
params[:published] = true
|
@@ -49,15 +49,16 @@ module Orange
|
|
49
49
|
m.versions.new(params.merge(:version => max + 1))
|
50
50
|
m.save
|
51
51
|
|
52
|
-
r = orange[:sitemap].routes_for(packet, :resource_id => m.id, :resource => @my_orange_name)
|
53
|
-
if
|
52
|
+
r = orange[:sitemap, true].routes_for(packet, :resource_id => m.id, :resource => @my_orange_name)
|
53
|
+
# Add route if none.
|
54
|
+
if (r.blank? && orange.loaded?(:sitemap))
|
54
55
|
route_hash = {
|
55
56
|
:orange_site_id => m.orange_site_id,
|
56
57
|
:resource => @my_orange_name,
|
57
58
|
:resource_id => m.id,
|
58
59
|
:slug => orange[:sitemap].slug_for(m, params),
|
59
60
|
:show_in_nav => false,
|
60
|
-
:link_text =>
|
61
|
+
:link_text => "{title}"
|
61
62
|
}
|
62
63
|
parents = orange[:sitemap].routes_for(packet, :resource => '', :resource_id => '', :slug => "pages")
|
63
64
|
route_hash[:parent] = parents.first unless parents.blank?
|
@@ -73,7 +74,7 @@ module Orange
|
|
73
74
|
def onNew(packet, params = {})
|
74
75
|
params[:published] = false
|
75
76
|
m = model_class.new(params)
|
76
|
-
m.orange_site = packet['site'] unless m.orange_site
|
77
|
+
m.orange_site = packet['subsite', false] ? packet['subsite'] : packet['site'] unless m.orange_site
|
77
78
|
# m.versions.new(params.merge(:version => 1))
|
78
79
|
m
|
79
80
|
end
|
@@ -81,16 +82,31 @@ module Orange
|
|
81
82
|
# Saves updates to an object specified by packet['route.resource_id'], then reroutes to main
|
82
83
|
# @param [Orange::Packet] packet the packet being routed
|
83
84
|
def onSave(packet, m, params = {})
|
85
|
+
r = orange[:sitemap, true].routes_for(packet, :resource_id => m.id, :resource => @my_orange_name)
|
86
|
+
# Add route if none.
|
87
|
+
if (r.blank? && orange.loaded?(:sitemap))
|
88
|
+
route_hash = {
|
89
|
+
:orange_site_id => m.orange_site_id,
|
90
|
+
:resource => @my_orange_name,
|
91
|
+
:resource_id => m.id,
|
92
|
+
:slug => orange[:sitemap].slug_for(m, params),
|
93
|
+
:show_in_nav => false,
|
94
|
+
:link_text => "{title}"
|
95
|
+
}
|
96
|
+
parents = orange[:sitemap].routes_for(packet, :resource => '', :resource_id => '', :slug => "pages")
|
97
|
+
route_hash[:parent] = parents.first unless parents.blank?
|
98
|
+
orange[:sitemap].add_route_for(packet, route_hash)
|
99
|
+
end
|
84
100
|
if (params["published"] == "1")
|
85
101
|
params["published"] = true
|
102
|
+
m.orange_site = packet['subsite', false] ? packet['subsite'] : packet['site'] unless m.orange_site
|
103
|
+
|
86
104
|
m.update(params)
|
87
|
-
|
88
|
-
orange[:pages].publish(packet, :no_reroute => true)
|
105
|
+
orange[:pages].publish(packet, :no_reroute => true, :model => m)
|
89
106
|
else
|
90
107
|
params["published"] = false
|
108
|
+
m.orange_site = packet['subsite', false] ? packet['subsite'] : packet['site'] unless m.orange_site
|
91
109
|
m.update(params)
|
92
|
-
m.orange_site = packet['site'] unless m.orange_site
|
93
|
-
m.save
|
94
110
|
end
|
95
111
|
end
|
96
112
|
|
@@ -116,7 +132,7 @@ module Orange
|
|
116
132
|
[:version, :orange_page_id, :page_id, :id].each { |i| attrs.delete(i) }
|
117
133
|
m.attributes = attrs
|
118
134
|
end
|
119
|
-
end
|
135
|
+
end # end if version
|
120
136
|
if mode == :show
|
121
137
|
case packet['route.context']
|
122
138
|
when :live
|
@@ -133,19 +149,24 @@ module Orange
|
|
133
149
|
end
|
134
150
|
m
|
135
151
|
end
|
136
|
-
|
137
|
-
end
|
152
|
+
end # end if show
|
138
153
|
m
|
139
154
|
end
|
140
155
|
|
141
156
|
def find_extras(packet, mode, opts = {})
|
142
157
|
case mode
|
143
158
|
when :edit
|
144
|
-
return {:routes => orange[:sitemap].routes_for(packet)}
|
159
|
+
return {:routes => orange[:sitemap, true].routes_for(packet)}
|
145
160
|
else {}
|
146
161
|
end
|
147
162
|
end
|
148
163
|
|
164
|
+
def routes(packet, opts = {})
|
165
|
+
model = opts if opts.is_a? model_class
|
166
|
+
model ||= opts[:model] || model_class.get(opts[:resource_id])
|
167
|
+
orange[:sitemap].routes_for(packet, {:resource => :pages, :resource_id => model.id})
|
168
|
+
end
|
169
|
+
|
149
170
|
def sitemap_row(packet, opts = {})
|
150
171
|
do_view(packet, :sitemap_row, opts)
|
151
172
|
end
|
@@ -4,8 +4,8 @@ require 'dm-is-awesome_set'
|
|
4
4
|
class OrangeRoute < Orange::SiteCarton
|
5
5
|
id
|
6
6
|
admin do
|
7
|
-
text :slug, :display_name => "Search Engine Friendly Page URL"
|
8
|
-
text :link_text
|
7
|
+
text :slug, :display_name => "Search Engine Friendly Page URL", :length => 255
|
8
|
+
text :link_text, :length => 255
|
9
9
|
text :reroute_to, :length => 255
|
10
10
|
boolean :show_in_nav, :default => false, :display_name => 'Show in Navigation?'
|
11
11
|
end
|
@@ -90,6 +90,26 @@ module Orange
|
|
90
90
|
packet.reroute(@my_orange_name, :orange) unless (packet.request.xhr? || no_reroute)
|
91
91
|
end
|
92
92
|
|
93
|
+
def show_in_nav(packet, opts = {})
|
94
|
+
no_reroute = opts.delete(:no_reroute)
|
95
|
+
if packet.request.post? || !opts.blank?
|
96
|
+
obj = find_one(packet, :show_in_nav, (opts[:id] || opts[:resource_id] || packet['route.resource_id']))
|
97
|
+
obj.show_in_nav = true
|
98
|
+
obj.save
|
99
|
+
end
|
100
|
+
packet.reroute(@my_orange_name, :orange) unless (packet.request.xhr? || no_reroute)
|
101
|
+
end
|
102
|
+
|
103
|
+
def unshow_in_nav(packet, opts = {})
|
104
|
+
no_reroute = opts.delete(:no_reroute)
|
105
|
+
if packet.request.post? || !opts.blank?
|
106
|
+
obj = find_one(packet, :unshow_in_nav, (opts[:id] || opts[:resource_id] || packet['route.resource_id']))
|
107
|
+
obj.show_in_nav = false
|
108
|
+
obj.save
|
109
|
+
end
|
110
|
+
packet.reroute(@my_orange_name, :orange) unless (packet.request.xhr? || no_reroute)
|
111
|
+
end
|
112
|
+
|
93
113
|
def higher(packet, opts = {})
|
94
114
|
move(packet, false, :direction => :higher)
|
95
115
|
end
|
@@ -208,6 +228,17 @@ module Orange
|
|
208
228
|
return 'route-'+model.id
|
209
229
|
end
|
210
230
|
|
231
|
+
def link_text_for(route)
|
232
|
+
return route.link_text unless route.resource && route.resource_id
|
233
|
+
if match = route.link_text.match(/^\{([-a-z0-9A-Z_]+)\}$/)
|
234
|
+
resource = route.resource.to_sym
|
235
|
+
return route.link_text unless orange.loaded?(resource)
|
236
|
+
orange[resource].model_class.get(route.resource_id).__send__(match[1])
|
237
|
+
else
|
238
|
+
route.link_text
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
211
242
|
def slug(str)
|
212
243
|
str.downcase.gsub(/[']+/, "").gsub(/[^a-z0-9]+/, "-")
|
213
244
|
end
|
@@ -16,7 +16,7 @@
|
|
16
16
|
.move_actions.dent_actions
|
17
17
|
= form_link('Indent', route_to(model_name, model.id, 'indent'), false, {:method => 'post', :class => 'indent arrow'}) if model.previous_sibling && model.previous_sibling.level == model.level
|
18
18
|
%p= ' '
|
19
|
-
%h4 #{
|
19
|
+
%h4 #{orange[:sitemap].link_text_for(item)} <span>(#{model.full_path})</span>
|
20
20
|
.linked_to
|
21
21
|
%p
|
22
22
|
Linked to:
|
@@ -4,9 +4,10 @@
|
|
4
4
|
- for item in model.children
|
5
5
|
- next unless item.show_in_nav
|
6
6
|
%li
|
7
|
-
%a{:href => item.full_path}= item
|
7
|
+
%a{:href => item.full_path}= orange[:sitemap].link_text_for(item)
|
8
8
|
- unless item.descendants.empty?
|
9
9
|
%ul.subnav
|
10
10
|
- for x in item.children
|
11
|
+
- next unless x.show_in_nav
|
11
12
|
%li
|
12
|
-
%a{:href => x.full_path}= x
|
13
|
+
%a{:href => x.full_path}= orange[:sitemap].link_text_for(x)
|
@@ -23,8 +23,8 @@ module Orange
|
|
23
23
|
packet.reroute(@my_orange_name, :orange)
|
24
24
|
end
|
25
25
|
|
26
|
-
def url_for(packet)
|
27
|
-
orange[:sitemap].url_for(packet, {:resource => 'subsites', :resource_id => packet['subsite'].id})
|
26
|
+
def url_for(packet, opts = {})
|
27
|
+
orange[:sitemap].url_for(packet, {:resource => 'subsites', :resource_id => (opts.is_a?(model_class) ? opts.id : packet['subsite'].id)})
|
28
28
|
end
|
29
29
|
|
30
30
|
def subsite_nav(packet, opts = {})
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 3
|
8
|
-
-
|
9
|
-
version: 0.3.
|
8
|
+
- 2
|
9
|
+
version: 0.3.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- David Haslem
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-06-01 00:00:00 -04:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -107,6 +107,7 @@ files:
|
|
107
107
|
- lib/orange-core/resources/page_parts.rb
|
108
108
|
- lib/orange-core/resources/parser.rb
|
109
109
|
- lib/orange-core/resources/routable_resource.rb
|
110
|
+
- lib/orange-core/resources/scaffold.rb
|
110
111
|
- lib/orange-core/stack.rb
|
111
112
|
- lib/orange-core/templates/exceptions.haml
|
112
113
|
- lib/orange-core/views/default_resource/create.haml
|
@@ -148,7 +149,9 @@ files:
|
|
148
149
|
- lib/orange-more/assets/cartons/asset_carton.rb
|
149
150
|
- lib/orange-more/assets/plugin.rb
|
150
151
|
- lib/orange-more/assets/resources/asset_resource.rb
|
152
|
+
- lib/orange-more/assets/views/assets/change.haml
|
151
153
|
- lib/orange-more/assets/views/assets/create.haml
|
154
|
+
- lib/orange-more/assets/views/assets/insert.haml
|
152
155
|
- lib/orange-more/blog.rb
|
153
156
|
- lib/orange-more/blog/cartons/blog.rb
|
154
157
|
- lib/orange-more/blog/cartons/blog_post.rb
|