orange 0.1.2 → 0.1.4

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 (40) hide show
  1. data/lib/orange-core/carton.rb +7 -8
  2. data/lib/orange-more.rb +4 -1
  3. data/lib/orange-more/administration/cartons/site.rb +6 -8
  4. data/lib/orange-more/administration/cartons/site_carton.rb +1 -1
  5. data/lib/orange-more/administration/cartons/user.rb +21 -11
  6. data/lib/orange-more/administration/middleware/access_control.rb +1 -1
  7. data/lib/orange-more/administration/middleware/site_load.rb +2 -2
  8. data/lib/orange-more/administration/resources/site_resource.rb +1 -1
  9. data/lib/orange-more/administration/resources/user_resource.rb +32 -1
  10. data/lib/orange-more/administration/views/users/create.haml +10 -0
  11. data/lib/orange-more/administration/views/users/edit.haml +15 -0
  12. data/lib/orange-more/blog/cartons/blog.rb +6 -8
  13. data/lib/orange-more/blog/cartons/blog_post.rb +50 -52
  14. data/lib/orange-more/blog/resources/blog_post_resource.rb +4 -4
  15. data/lib/orange-more/blog/resources/blog_resource.rb +14 -11
  16. data/lib/orange-more/news.rb +1 -0
  17. data/lib/orange-more/news/cartons/news.rb +12 -0
  18. data/lib/orange-more/news/plugin.rb +13 -0
  19. data/lib/orange-more/news/resources/news_resource.rb +73 -0
  20. data/lib/orange-more/news/views/news/archive.haml +14 -0
  21. data/lib/orange-more/news/views/news/edit.haml +7 -0
  22. data/lib/orange-more/news/views/news/latest.haml +8 -0
  23. data/lib/orange-more/news/views/news/sitemap_row.haml +14 -0
  24. data/lib/orange-more/pages/cartons/page_carton.rb +10 -11
  25. data/lib/orange-more/pages/cartons/page_version_carton.rb +9 -10
  26. data/lib/orange-more/pages/resources/page_resource.rb +1 -1
  27. data/lib/orange-more/sitemap/cartons/route.rb +34 -36
  28. data/lib/orange-more/sitemap/resources/sitemap_resource.rb +28 -12
  29. data/lib/orange-more/subsites.rb +1 -0
  30. data/lib/orange-more/subsites/cartons/subsite.rb +8 -0
  31. data/lib/orange-more/subsites/middleware/subsite_load.rb +28 -0
  32. data/lib/orange-more/subsites/plugin.rb +17 -0
  33. data/lib/orange-more/subsites/resources/subsite_resource.rb +46 -0
  34. data/lib/orange-more/subsites/views/subsites/index.haml +2 -0
  35. data/lib/orange-more/testimonials.rb +1 -0
  36. data/lib/orange-more/testimonials/cartons/testimonials_carton.rb +15 -0
  37. data/lib/orange-more/testimonials/plugin.rb +13 -0
  38. data/lib/orange-more/testimonials/resources/testimonials_resource.rb +26 -0
  39. data/lib/orange-more/testimonials/views/testimonials/testimonials.haml +4 -0
  40. metadata +23 -2
@@ -23,6 +23,9 @@ module Orange
23
23
  # improve scaffolding capability.
24
24
  class Carton
25
25
  SCAFFOLD_OPTIONS = [:display_name, :levels] unless defined?(SCAFFOLD_OPTIONS)
26
+ extend ClassInheritableAttributes
27
+ cattr_accessor :scaffold_properties
28
+
26
29
  # Declares a ModelResource subclass that scaffolds this carton
27
30
  # The Subclass will have the name of the carton followed by "_Resource"
28
31
  def self.as_resource
@@ -41,21 +44,17 @@ module Orange
41
44
  def self.id
42
45
  include DataMapper::Resource
43
46
  property(:id, Serial)
44
- @scaffold_properties = []
47
+ self.scaffold_properties ||= []
45
48
  init
46
49
  end
47
50
 
48
- def self.scaffold_properties
49
- @scaffold_properties ||= []
50
- end
51
-
52
51
  # Stub init method
53
52
  def self.init
54
53
  end
55
54
 
56
55
  # Return properties that should be shown for a given context
57
56
  def self.form_props(context = :live)
58
- scaffold_properties.select{|p| p[:levels].include?(context) }
57
+ self.scaffold_properties.select{|p| p[:levels].include?(context) }
59
58
  end
60
59
 
61
60
  # Helper to wrap properties into admin level
@@ -80,7 +79,7 @@ module Orange
80
79
  end
81
80
 
82
81
  def self.add_scaffold(name, type, dm_type, opts)
83
- scaffold_properties << {:name => name, :type => type, :levels => @levels}.merge(opts) if @levels || opts.has_key?(:levels)
82
+ self.scaffold_properties << {:name => name, :type => type, :levels => @levels}.merge(opts) if @levels || opts.has_key?(:levels)
84
83
  opts = opts.delete_if{|k,v| SCAFFOLD_OPTIONS.include?(k)} # DataMapper doesn't like arbitrary opts
85
84
  self.property(name, dm_type, opts)
86
85
  end
@@ -112,7 +111,7 @@ module Orange
112
111
  # Define a helper for type database stuff
113
112
  # Show in a context if wrapped in one of the helpers
114
113
  def self.expose(name, opts = {})
115
- scaffold_properties << {:name => name, :type => :text, :levels => @levels, :opts => opts} if @levels
114
+ self.scaffold_properties << {:name => name, :type => :text, :levels => @levels, :opts => opts} if @levels
116
115
  end
117
116
 
118
117
  # Define a helper for input type="text" type database stuff
data/lib/orange-more.rb CHANGED
@@ -9,6 +9,9 @@ require File.join(libdir, 'orange-more', 'pages')
9
9
  require File.join(libdir, 'orange-more', 'sitemap')
10
10
  require File.join(libdir, 'orange-more', 'slices')
11
11
  require File.join(libdir, 'orange-more', 'blog')
12
+ require File.join(libdir, 'orange-more', 'news')
12
13
  require File.join(libdir, 'orange-more', 'disqus')
14
+ require File.join(libdir, 'orange-more', 'testimonials')
13
15
  require File.join(libdir, 'orange-more', 'cloud')
14
- require File.join(libdir, 'orange-more', 'debugger')
16
+ require File.join(libdir, 'orange-more', 'debugger')
17
+ require File.join(libdir, 'orange-more', 'subsites')
@@ -1,9 +1,7 @@
1
- module Orange
2
- class Site < Carton
3
- id
4
- admin do
5
- title :name
6
- text :url
7
- end
1
+ class OrangeSite < Orange::Carton
2
+ id
3
+ admin do
4
+ title :name
5
+ text :url
8
6
  end
9
- end
7
+ end
@@ -6,7 +6,7 @@ module Orange
6
6
  # it is what defines the relationship)
7
7
  class SiteCarton < Carton
8
8
  def self.init
9
- belongs_to :orange_site, 'Orange::Site'
9
+ belongs_to :orange_site
10
10
  end
11
11
  end
12
12
  end
@@ -1,17 +1,27 @@
1
1
  require 'orange-core/carton'
2
2
 
3
- module Orange
4
- class User < Orange::Carton
5
- id
6
- admin do
7
- title :name
8
- text :open_id
9
- end
10
-
11
- # Currently, all users allowed at all times.
12
- # Future support for roles to be built here.
13
- def allowed?(packet)
3
+ class OrangeUser < Orange::Carton
4
+ id
5
+ admin do
6
+ title :name
7
+ text :open_id
8
+ end
9
+
10
+ has n, :orange_sites, :through => Resource
11
+
12
+ def allowed?(packet)
13
+ subsite_access = packet['subsite'].blank? ? false : self.orange_sites.first(:id => packet['subsite'].id)
14
+ site_access = self.orange_sites.first(:id => packet['site'].id)
15
+ if(site_access)
14
16
  true
17
+ elsif !packet['subsite'].blank? && subsite_access
18
+ true
19
+ else
20
+ false
15
21
  end
16
22
  end
23
+ end
24
+
25
+ class OrangeSite
26
+ has n, :orange_users, :through => Resource
17
27
  end
@@ -48,7 +48,7 @@ module Orange::Middleware
48
48
  def access_allowed?(packet)
49
49
  return true unless @locked.include?(packet['route.context'])
50
50
  if packet['user.id'] || packet['orange.globals']['main_user'] == false
51
- if @single && (packet['user.id'] == packet['orange.globals']['main_user'])
51
+ if @single && (packet['user.id'] == packet['orange.globals']['main_user'] )
52
52
  true
53
53
  elsif @single
54
54
  # Current id no good.
@@ -6,11 +6,11 @@ module Orange::Middleware
6
6
  class SiteLoad < Base
7
7
  def packet_call(packet)
8
8
  url = packet['route.site_url']
9
- site = Orange::Site.first(:url.like => url)
9
+ site = OrangeSite.first(:url.like => url)
10
10
  if site
11
11
  packet['site'] = site
12
12
  else
13
- s = Orange::Site.new({:url => packet['route.site_url'],
13
+ s = OrangeSite.new({:url => packet['route.site_url'],
14
14
  :name => 'An Orange Site'})
15
15
  s.save
16
16
  packet['site'] = s
@@ -1,6 +1,6 @@
1
1
  module Orange
2
2
  class SiteResource < ModelResource
3
- use Orange::Site
3
+ use OrangeSite
4
4
  call_me :orange_sites
5
5
  def afterLoad
6
6
  orange[:admin].add_link('Settings', :resource => @my_orange_name,
@@ -1,6 +1,6 @@
1
1
  module Orange
2
2
  class UserResource < Orange::ModelResource
3
- use Orange::User
3
+ use OrangeUser
4
4
  call_me :users
5
5
  def afterLoad
6
6
  orange[:admin].add_link("Settings", :resource => @my_orange_name, :text => 'Users')
@@ -15,5 +15,36 @@ module Orange
15
15
  def user_for(packet)
16
16
  model_class.first(:open_id => packet['user.id'])
17
17
  end
18
+
19
+ def new(packet, *opts)
20
+ if packet.request.post?
21
+ params = packet.request.params[@my_orange_name.to_s]
22
+ sites = params.delete 'sites'
23
+ m = model_class.new(params)
24
+ m.save
25
+ sites.each{|k,v| s = OrangeSite.first(:id => k); m.orange_sites << s if s} if sites
26
+ m.save
27
+ end
28
+ packet.reroute(@my_orange_name, :orange)
29
+ end
30
+
31
+ def save(packet, *opts)
32
+ if packet.request.post?
33
+ m = model_class.get(packet['route.resource_id'])
34
+ if m
35
+ params = packet.request.params[@my_orange_name.to_s]
36
+ sites = params.delete 'sites'
37
+ m.update(params)
38
+ m.orange_sites.destroy
39
+ sites.each{|k,v| s = OrangeSite.first(:id => k); m.orange_sites << s if s} if sites
40
+ m.save
41
+ end
42
+ end
43
+ packet.reroute(@my_orange_name, :orange)
44
+ end
45
+
46
+ def find_extras(packet, mode)
47
+ {:sites => OrangeSite.all}
48
+ end
18
49
  end
19
50
  end
@@ -0,0 +1,10 @@
1
+ %form{:action => "#{packet.route_to(model_name, 'new')}", :method => 'post'}
2
+ - for prop in props
3
+ %p= view_attribute(prop, model_name, :label => true)
4
+ %fieldset
5
+ %h4 Permission to Edit:
6
+ - for site in sites
7
+ %p
8
+ #{site.name}
9
+ %input{:type => 'checkbox', :name => "#{model_name}[sites][#{site.id}]", :value => site.id}
10
+ %input{:type => 'submit', :value => 'Save New Item'}
@@ -0,0 +1,15 @@
1
+ - if model
2
+ - if resource.options[:sitemappable, false]
3
+ = orange[:sitemap, true].sitemap_links(packet, {:slug_me => orange[:sitemap, true].slug_for(model, props)})
4
+ %form{:action => packet.route_to(model_name, model[:id], 'save'), :method => 'post'}
5
+ - for prop in props
6
+ %p!= view_attribute(prop, model_name, :label => true, :value => model.attribute_get(prop[:name]))
7
+ %fieldset
8
+ %h4 Permission to Edit:
9
+ - for site in sites
10
+ %p
11
+ #{site.name}
12
+ %input{:type => 'checkbox', :name => "#{model_name}[sites][#{site.id}]", :value => site.id, :checked => (model.orange_sites.include?(site) ? 'checked' : nil)}
13
+ %input{:type => 'submit', :value => 'Save Changes'}
14
+ - else
15
+ %p Couldn't find the item you're looking for.
@@ -1,10 +1,8 @@
1
1
  require 'orange-more/administration/cartons/site_carton'
2
- module Orange
3
- class Blog < Orange::SiteCarton
4
- id
5
- front do
6
- title :title
7
- end
8
- has n, :posts, "Orange::BlogPost"
2
+ class OrangeBlog < Orange::SiteCarton
3
+ id
4
+ front do
5
+ title :title
9
6
  end
10
- end
7
+ has n, :posts, "OrangeBlogPost"
8
+ end
@@ -1,55 +1,53 @@
1
1
  require 'dm-timestamps'
2
- module Orange
3
- class BlogPost < Orange::Carton
4
- id
5
- front do
6
- title :title
7
- fulltext :body
8
- end
9
- admin do
10
- fulltext :summary
11
- end
12
- orange do
13
- boolean :published, :default => false
14
- text :slug
15
- text :author
16
- end
17
-
18
- property :created_at, DateTime
19
- property :published_at, DateTime
20
- property :updated_at, DateTime
21
- belongs_to :blog, "Orange::Blog"
22
-
23
- def title=(t)
24
- self.attribute_set('title', t)
25
- self.attribute_set('slug', t.downcase.gsub(/[^a-z0-9-]+$/, ''))
26
- end
27
-
28
- def publish
29
- self.published_at = Time.now
30
- self.published = true
31
- end
32
-
33
- def publish!
34
- self.published_at = Time.now
35
- self.published = true
36
- self.save
37
- end
38
-
39
- def self.year_and_month(yr, mnth)
40
- all(:published_at.gte => DateTime.new(yr, mnth, 1), :published_at.lt => DateTime.new(yr, mnth + 1, 1))
41
- end
42
-
43
- def self.slug(slug)
44
- first(:slug => slug)
45
- end
46
-
47
- def self.published
48
- all(:published => true)
49
- end
50
-
51
- def self.draft
52
- all(:published => false)
53
- end
2
+ class OrangeBlogPost < Orange::Carton
3
+ id
4
+ front do
5
+ title :title
6
+ fulltext :body
7
+ end
8
+ admin do
9
+ fulltext :summary
10
+ end
11
+ orange do
12
+ boolean :published, :default => false
13
+ text :slug
14
+ text :author
15
+ end
16
+
17
+ property :created_at, DateTime
18
+ property :published_at, DateTime
19
+ property :updated_at, DateTime
20
+ belongs_to :blog, "OrangeBlog"
21
+
22
+ def title=(t)
23
+ self.attribute_set('title', t)
24
+ self.attribute_set('slug', str.downcase.gsub(/[']+/, "").gsub(/[^a-z0-9]+/, "_"))
25
+ end
26
+
27
+ def publish
28
+ self.published_at = Time.now
29
+ self.published = true
30
+ end
31
+
32
+ def publish!
33
+ self.published_at = Time.now
34
+ self.published = true
35
+ self.save
36
+ end
37
+
38
+ def self.year_and_month(yr, mnth)
39
+ all(:published_at.gte => DateTime.new(yr, mnth, 1), :published_at.lt => DateTime.new(yr, mnth + 1, 1))
40
+ end
41
+
42
+ def self.slug(slug)
43
+ first(:slug => slug)
44
+ end
45
+
46
+ def self.published
47
+ all(:published => true)
48
+ end
49
+
50
+ def self.draft
51
+ all(:published => false)
54
52
  end
55
53
  end
@@ -1,6 +1,6 @@
1
1
  module Orange
2
2
  class BlogResource < Orange::ModelResource
3
- use Orange::BlogPost
3
+ use OrangeBlogPost
4
4
  call_me :blog_posts
5
5
  def afterLoad
6
6
  orange[:admin, true].add_link("Content", :resource => @my_orange_name, :text => 'Blog')
@@ -26,7 +26,7 @@ module Orange
26
26
  params[:published] = false
27
27
  params[:author] = packet['user', false] ? packet['user'].name : "Author"
28
28
 
29
- blog = Orange::Blog.first(:orange_site => packet['site'])
29
+ blog = OrangeBlog.first(:orange_site => (packet['subsite'].blank? ? packet['site'] : packet['subsite']))
30
30
  blog.posts.new(params)
31
31
  blog.save
32
32
  end
@@ -41,7 +41,7 @@ module Orange
41
41
  if m
42
42
  params = packet.request.params[@my_orange_name.to_s]
43
43
  m.update(params)
44
- m.blog = Orange::Blog.first(:orange_site => packet['site'])
44
+ m.blog = OrangeBlog.first(:orange_site => (packet['subsite'].blank? ? packet['site'] : packet['subsite']))
45
45
  m.save
46
46
  end
47
47
  end
@@ -49,7 +49,7 @@ module Orange
49
49
  end
50
50
 
51
51
  def find_list(packet, mode, id =false)
52
- blog = orange[:blog].blog_for_site(packet, packet['site'].id)
52
+ blog = orange[:blog].blog_for_site(packet)
53
53
  blog.posts
54
54
  end
55
55
 
@@ -1,6 +1,6 @@
1
1
  module Orange
2
2
  class BlogPostResource < Orange::ModelResource
3
- use Orange::Blog
3
+ use OrangeBlog
4
4
  call_me :blog
5
5
  def afterLoad
6
6
  orange[:admin, true].add_link("Settings", :resource => @my_orange_name, :text => 'Blog')
@@ -25,7 +25,7 @@ module Orange
25
25
 
26
26
  def blog_post_view(packet, opts = {})
27
27
  resource_path = packet['route.resource_path']
28
- blog = Orange::Blog.first(:orange_site_id => packet['site'].id)
28
+ blog = blog_for_site(packet)
29
29
  opts.merge!( :blog_url => blog_url_for(packet))
30
30
  parts = resource_path.split('/')
31
31
  unless parts.size < 4
@@ -39,15 +39,15 @@ module Orange
39
39
  end
40
40
 
41
41
  def blog_url_for(packet)
42
- blog = Orange::Blog.first(:orange_site_id => packet['site'].id)
43
- blog_url = orange[:sitemap, true].url_for(packet, :orange_site_id => blog.orange_site_id, :resource => :blog, :resource_id => blog.id, :resource_action => :blog_view)
42
+ blog = blog_for_site(packet)
43
+ blog_url = orange[:sitemap, true].url_for(packet, :orange_site_id => blog.orange_site_id, :resource => :blog, :resource_id => blog.id, :resource_action => :blog_view, :include_subsite => true)
44
44
  blog_url.gsub!(/\/$/, '')
45
45
  end
46
46
 
47
47
  def blog_offset_list_view(packet, opts = {})
48
48
  opts.merge!(packet.extract_opts)
49
49
  opts.merge!( :blog_url => blog_url_for(packet))
50
- blog = Orange::Blog.first(:orange_site_id => packet['site'].id)
50
+ blog = blog_for_site(packet)
51
51
  opts[:page] = opts[:page].to_i unless opts[:page].blank?
52
52
  page = opts[:page].blank? ? 0 : opts[:page] - 1
53
53
  opts[:list] = blog.posts.published.all(:order => :published_at.desc,
@@ -67,15 +67,18 @@ module Orange
67
67
  do_list_view(packet, :blog_archive_view, opts)
68
68
  end
69
69
 
70
- def blog_for_site(packet, site_id)
71
- blog = Orange::Blog.first(:orange_site_id => packet['site'].id)
70
+ def blog_for_site(packet, site_id = false)
71
+ site_id ||= (packet['subsite'].blank? ? packet['site'].id : packet['subsite'].id)
72
+ blog = OrangeBlog.first(:orange_site_id => site_id)
72
73
  unless blog
73
- blog = Orange::Blog.new
74
+ blog = OrangeBlog.new
74
75
  blog.title = 'An Orange Hosted Blog'
75
76
  blog.orange_site = packet['site']
76
77
  blog.save
78
+ end
79
+ unless OrangeRoute.first(:resource => 'blog', :orange_site_id => packet['site'].id)
77
80
  orange[:sitemap, true].add_route_for(packet,
78
- :orange_site_id => packet['site'].id,
81
+ :orange_site_id => site_id,
79
82
  :resource => :blog,
80
83
  :resource_id => blog.id,
81
84
  :resource_action => :blog_view,
@@ -87,11 +90,11 @@ module Orange
87
90
  end
88
91
 
89
92
  def find_list(packet, mode, id =false)
90
- blog = orange[:blog].blog_for_site(packet, packet['site'].id)
93
+ blog = blog_for_site(packet)
91
94
  case mode
92
95
  when :blog_list_view then blog.posts.published.all(:order => :published_at.desc, :limit => 5)
93
96
  when :blog_archive_view then blog.posts.published
94
- else Orange::Blog.all
97
+ else OrangeBlog.all
95
98
  end
96
99
  end
97
100
 
@@ -0,0 +1 @@
1
+ require File.join('orange-more', 'news', 'plugin')
@@ -0,0 +1,12 @@
1
+ require 'dm-timestamps'
2
+ class OrangeNews < Orange::Carton
3
+ id
4
+ front do
5
+ title :title
6
+ text :link
7
+ fulltext :description
8
+ end
9
+
10
+ property :created_at, DateTime
11
+ property :updated_at, DateTime
12
+ end
@@ -0,0 +1,13 @@
1
+ Dir.glob(File.join(File.dirname(__FILE__), 'cartons', '*.rb')).each {|f| require f }
2
+ Dir.glob(File.join(File.dirname(__FILE__), 'resources', '*.rb')).each {|f| require f }
3
+
4
+ module Orange::Plugins
5
+ class News < Base
6
+ views_dir File.join(File.dirname(__FILE__), 'views')
7
+
8
+ resource Orange::NewsResource.new
9
+ end
10
+ end
11
+
12
+ Orange.plugin(Orange::Plugins::News.new)
13
+
@@ -0,0 +1,73 @@
1
+ module Orange
2
+ class NewsResource < Orange::ModelResource
3
+ use OrangeNews
4
+ call_me :news
5
+ def afterLoad
6
+ orange[:admin, true].add_link("Content", :resource => @my_orange_name, :text => 'News')
7
+
8
+ orange.register(:stack_loaded) do
9
+ orange[:radius, true].context.define_tag "latest_news" do |tag|
10
+ orange[:news].latest(tag.locals.packet)
11
+ end
12
+ end
13
+ end
14
+
15
+ def new(packet, opts = {})
16
+ news = OrangeNews.first()
17
+ unless OrangeRoute.first(:resource => 'news', :orange_site_id => packet['site'].id)
18
+ orange[:sitemap, true].add_route_for(packet,
19
+ :orange_site_id => packet['site'].id,
20
+ :resource => :news,
21
+ :resource_action => :archive,
22
+ :slug => 'news-archive',
23
+ :link_text => 'Orange News Archive'
24
+ )
25
+ end
26
+
27
+ super(packet, opts)
28
+ end
29
+
30
+ def sitemap_row(packet, opts = {})
31
+ do_view(packet, :sitemap_row, opts)
32
+ end
33
+
34
+ def news_view(packet, opts = {})
35
+ resource_path = packet['route.resource_path']
36
+ if resource_path.blank?
37
+ archive_view(packet, opts)
38
+ elsif resource_path =~ /^\/page/
39
+ archive(packet, opts)
40
+ else
41
+ archive_view(packet, opts)
42
+ end
43
+ end
44
+
45
+ def latest(packet)
46
+ do_list_view(packet, :latest, {
47
+ :list => model_class.all(:order => :created_at.desc, :limit => 3)
48
+ })
49
+ end
50
+
51
+ def archive(packet, opts = {})
52
+ opts.merge!(packet.extract_opts)
53
+ opts.merge!( :archive_url => archive_url(packet))
54
+ opts[:page] = opts[:page].blank? ? 1 : opts[:page].to_i
55
+ page = opts[:page].blank? ? 0 : opts[:page] - 1
56
+ opts[:list] = model_class.all(:order => :created_at.desc,
57
+ :limit => 5,
58
+ :offset => (5*page)
59
+ )
60
+ opts[:pages] = (model_class.count / 5) + 1
61
+ do_list_view(packet, :archive, opts)
62
+ end
63
+
64
+ def archive_view(packet, opts = {})
65
+ archive(packet, opts.merge!({:page => 1}))
66
+ end
67
+
68
+ def archive_url(packet)
69
+ url = orange[:sitemap, true].url_for(packet, :resource => :news, :resource_action => :archive)
70
+ url.gsub!(/\/$/, '')
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,14 @@
1
+ .news_items
2
+ - list.each do |news|
3
+ .news_item
4
+ %h2.news_title
5
+ %a{:href => news.link} #{news.title}
6
+ .news_description
7
+ = news.description
8
+ %p
9
+ %a{:href => news.link, :class => 'view_story'} View Story &raquo;
10
+ .news_nav
11
+ - if page > 1
12
+ %a.newer{:href => "#{archive_url}/page/#{page-1}"} Newer Posts
13
+ - if page < pages
14
+ %a.older{:href => "#{archive_url}/page/#{page+1}"} Older Posts
@@ -0,0 +1,7 @@
1
+ - if model
2
+ %form{:action => route_to(model_name, model[:id], 'save'), :method => 'post'}
3
+ - for prop in props
4
+ %p~ view_attribute(prop, model_name, :label => true, :value => model.attribute_get(prop[:name]))
5
+ %input{:type => 'submit', :value => 'Save Changes'}
6
+ - else
7
+ %p Couldn't find the item you're looking for.
@@ -0,0 +1,8 @@
1
+ - list.each do |news|
2
+ .news_item
3
+ %p.news_title
4
+ %a{:href => news.link} #{news.title}
5
+ .news_description
6
+ = news.description
7
+ %p
8
+ %a{:href => news.link, :class => 'view_story'} View Story &raquo;
@@ -0,0 +1,14 @@
1
+ - if route
2
+ .sitemap_item{:class => "sitemap_level_#{route.level}"}
3
+ - if route.level > 0
4
+ = orange[:sitemap].route_actions(packet, :model => route)
5
+ %h4 #{route.link_text} <span>(#{route.full_path})</span>
6
+ .linked_to
7
+ %p
8
+ News Archive
9
+ %br
10
+ %a{:href => route_to(:news, 'create')} Add New News Post
11
+ .actions
12
+ = form_link('Delete', route_to(:sitemap, route.id, 'delete'), 'Are you sure you want to delete this?', {:method => 'delete'})
13
+ %a{:href => route_to(:sitemap, route.id, 'edit')} Edit
14
+ %br.clear
@@ -1,15 +1,14 @@
1
1
  require 'dm-timestamps'
2
2
  require 'orange-more/administration/cartons/site_carton'
3
- module Orange
4
- class Page < Orange::SiteCarton
5
- id
6
- front do
7
- title :title
8
- fulltext :body
9
- end
10
- boolean :published, :default => false
11
-
12
- property :updated_at, DateTime
13
- has n, :versions, "Orange::PageVersion"
3
+
4
+ class OrangePage < Orange::SiteCarton
5
+ id
6
+ front do
7
+ title :title
8
+ fulltext :body
14
9
  end
10
+ boolean :published, :default => false
11
+
12
+ property :updated_at, DateTime
13
+ has n, :versions, "OrangePageVersion"
15
14
  end
@@ -1,13 +1,12 @@
1
1
  require 'dm-timestamps'
2
2
  require 'orange-more/administration/cartons/site_carton'
3
- module Orange
4
- class PageVersion < Orange::SiteCarton
5
- id
6
- title :title
7
- fulltext :body
8
- property :updated_at, DateTime
9
- boolean :published
10
- property :version, Integer, :default => 0
11
- belongs_to :orange_page, "Orange::Page"
12
- end
3
+
4
+ class OrangePageVersion < Orange::SiteCarton
5
+ id
6
+ title :title
7
+ fulltext :body
8
+ property :updated_at, DateTime
9
+ boolean :published
10
+ property :version, Integer, :default => 0
11
+ belongs_to :orange_page, "OrangePage"
13
12
  end
@@ -1,6 +1,6 @@
1
1
  module Orange
2
2
  class PageResource < Orange::ModelResource
3
- use Orange::Page
3
+ use OrangePage
4
4
  call_me :pages
5
5
  def afterLoad
6
6
  orange[:admin, true].add_link("Content", :resource => @my_orange_name, :text => 'Pages')
@@ -1,43 +1,41 @@
1
1
  require 'orange-more/administration/cartons/site_carton'
2
2
  require 'dm-is-awesome_set'
3
3
 
4
- module Orange
5
- class Route < SiteCarton
6
- id
7
- admin do
8
- text :slug
9
- text :link_text
10
- boolean :show_in_nav, :default => false, :display_name => 'Show in Navigation?'
11
- end
12
- orange do
13
- string :resource
14
- string :resource_id
15
- string :resource_action
16
- boolean :accept_args, :default => true
17
- end
18
- include DataMapper::Transaction::Resource # Make sure Transactions are included (for awesome_set)
19
- is :awesome_set, :scope => [:orange_site_id]
20
-
21
- def full_path
22
- self_and_ancestors.inject('') do |path, part|
23
- if part.parent # Check if this is a child
24
- path = path + part.slug + '/'
25
- else # The root slug is just the initial '/'
26
- path = path + '/'
27
- end
4
+ class OrangeRoute < Orange::SiteCarton
5
+ id
6
+ admin do
7
+ text :slug
8
+ text :link_text
9
+ boolean :show_in_nav, :default => false, :display_name => 'Show in Navigation?'
10
+ end
11
+ orange do
12
+ string :resource
13
+ string :resource_id
14
+ string :resource_action
15
+ boolean :accept_args, :default => true
16
+ end
17
+ include DataMapper::Transaction::Resource # Make sure Transactions are included (for awesome_set)
18
+ is :awesome_set, :scope => [:orange_site_id]
19
+
20
+ def full_path
21
+ self_and_ancestors.inject('') do |path, part|
22
+ if part.parent # Check if this is a child
23
+ path = path + part.slug + '/'
24
+ else # The root slug is just the initial '/'
25
+ path = path + '/'
28
26
  end
29
27
  end
30
-
31
- def self.home_for_site(site_id)
32
- root(:orange_site_id => site_id)
33
- end
34
-
35
-
36
- def self.create_home_for_site(site_id)
37
- home = self.new({:orange_site_id => site_id, :slug => '_index_', :accept_args => false, :link_text => 'Home'})
38
- home.move(:root)
39
- home.save
40
- home
41
- end
28
+ end
29
+
30
+ def self.home_for_site(site_id)
31
+ root(:orange_site_id => site_id)
32
+ end
33
+
34
+
35
+ def self.create_home_for_site(site_id)
36
+ home = self.new({:orange_site_id => site_id, :slug => '_index_', :accept_args => false, :link_text => 'Home'})
37
+ home.move(:root)
38
+ home.save
39
+ home
42
40
  end
43
41
  end
@@ -3,7 +3,7 @@ require 'orange-core/resources/model_resource'
3
3
  module Orange
4
4
 
5
5
  class SitemapResource < ModelResource
6
- use Orange::Route
6
+ use OrangeRoute
7
7
  call_me :sitemap
8
8
  def afterLoad
9
9
  orange[:admin, true].add_link('Content', :resource => @my_orange_name, :text => 'Sitemap')
@@ -23,10 +23,11 @@ module Orange
23
23
  packet[:content] = (orange[resource].view packet)
24
24
  end
25
25
 
26
- def route?(packet, path)
26
+ # Path should be an array of path parts
27
+ def find_route_info(packet, path)
27
28
  parts = path.split('/')
28
29
  pad = parts.shift
29
- matched = home(packet)
30
+ matched = home(packet, :subsite => true)
30
31
  extras = ''
31
32
  while (!parts.empty?)
32
33
  next_part = parts.shift
@@ -38,6 +39,11 @@ module Orange
38
39
  parts = []
39
40
  end
40
41
  end
42
+ [extras, matched]
43
+ end
44
+
45
+ def route?(packet, path)
46
+ extras, matched = find_route_info(packet, path)
41
47
  return false if(extras.length > 0 && !matched.accept_args)
42
48
  packet['route.path'] = path
43
49
  packet['route.route'] = matched
@@ -54,7 +60,7 @@ module Orange
54
60
  def new(packet, *opts)
55
61
  if packet.request.post?
56
62
  params = packet.request.params[@my_orange_name.to_s]
57
- params.merge!(:orange_site_id => packet['site'].id)
63
+ params.merge!(:orange_site_id => (packet['subsite'].blank? ? packet['site'].id : packet['subsite'].id))
58
64
  a = model_class.new(params)
59
65
  a.move(:into => home(packet))
60
66
  end
@@ -94,7 +100,11 @@ module Orange
94
100
  end
95
101
 
96
102
  def home(packet, opts = {})
97
- site_id = opts[:orange_site_id] || packet['site'].id
103
+ if(opts[:subsite])
104
+ site_id = opts[:orange_site_id] || packet['subsite'].blank? ? packet['site'].id : packet['subsite'].id
105
+ else
106
+ site_id = opts[:orange_site_id] || packet['site'].id
107
+ end
98
108
  model_class.home_for_site(site_id) || model_class.create_home_for_site(site_id)
99
109
  end
100
110
 
@@ -102,17 +112,18 @@ module Orange
102
112
  do_view(packet, :two_level, :model => home(packet))
103
113
  end
104
114
 
105
- def routes_for(packet)
115
+ def routes_for(packet, opts = {})
106
116
  keys = {}
107
- keys[:resource] = packet['route.resource'] unless packet['route.resource'].blank?
108
- keys[:resource_id] = packet['route.resource_id'] unless packet['route.resource_id'].blank?
109
- keys[:orange_site_id] = packet['site'].id unless packet['site'].blank?
117
+ keys[:resource] = opts[:resource] || packet['route.resource']
118
+ keys[:resource_id] = opts[:resource_id] || packet['route.resource_id']
119
+ keys[:orange_site_id] = opts[:orange_site_id] || packet['subsite'].blank? ? packet['site'].id : packet['subsite'].id
120
+ keys.delete_if{|k,v| v.blank? }
110
121
  model_class.all(keys)
111
122
  end
112
123
 
113
124
  def add_link_for(packet)
114
125
  linky = ['add_route']
115
- linky << (packet['site'].blank? ? '0' : packet['site'].id)
126
+ linky << (packet['subsite'].blank? ? (packet['site'].blank? ? '0' : packet['site'].id) : packet['subsite'].id)
116
127
  linky << (packet['route.resource'].blank? ? '0' : packet['route.resource'])
117
128
  linky << (packet['route.resource_id'].blank? ? '0' : packet['route.resource_id'])
118
129
  packet.route_to(:sitemap, linky.join('/') )
@@ -127,8 +138,13 @@ module Orange
127
138
  end
128
139
 
129
140
  def url_for(packet, opts = {})
141
+ include_subsite = opts.delete(:include_subsite) || false
130
142
  m = model_class.first(opts)
131
- m ? m.full_path : '#not_found'
143
+ if !packet['subsite'].blank? && include_subsite
144
+ return orange[:subsites].url_for(packet).gsub(/\/$/, '') + (m ? m.full_path : '#not_found')
145
+ else
146
+ return (m ? m.full_path : '#not_found')
147
+ end
132
148
  end
133
149
 
134
150
  def add_route(packet, opts = {})
@@ -156,7 +172,7 @@ module Orange
156
172
  end
157
173
 
158
174
  def find_list(packet, mode, *args)
159
- home(packet).self_and_descendants
175
+ home(packet, :subsite => true).self_and_descendants
160
176
  end
161
177
 
162
178
  def table_row(packet, opts ={})
@@ -0,0 +1 @@
1
+ require File.join('orange-more', 'subsites', 'plugin')
@@ -0,0 +1,8 @@
1
+ class OrangeSite < Orange::Carton
2
+ property :type, Discriminator
3
+ has n, :subsites, 'OrangeSubsite'
4
+ end
5
+
6
+ class OrangeSubsite < OrangeSite
7
+ belongs_to :orange_site, :required => false
8
+ end
@@ -0,0 +1,28 @@
1
+ require 'orange-core/middleware/base'
2
+ module Orange::Middleware
3
+ # This will load information about the site to into the orange env
4
+ # - packet['site'] will be an instance of the site object
5
+ #
6
+ class SubsiteLoad < Base
7
+ def packet_call(packet)
8
+ if packet['site']
9
+ site = packet['site']
10
+ path = packet['route.path'] || packet.request.path_info
11
+
12
+ # Find the subsite in the sitemap table
13
+ extras, matched = orange[:sitemap].find_route_info(packet, path)
14
+
15
+ # If matched, update the loaded site and trim the path down a bit
16
+ if !matched.resource.blank? && matched.resource.to_sym == :subsites
17
+ if(m = site.subsites.first(:id => matched.resource_id))
18
+ packet['route.path'] = extras
19
+ packet['subsite'] = m
20
+ end
21
+ end
22
+ end
23
+ pass packet
24
+ end
25
+ end
26
+
27
+ end
28
+
@@ -0,0 +1,17 @@
1
+ Dir.glob(File.join(File.dirname(__FILE__), 'cartons', '*.rb')).each {|f| require f }
2
+ Dir.glob(File.join(File.dirname(__FILE__), 'resources', '*.rb')).each {|f| require f }
3
+ Dir.glob(File.join(File.dirname(__FILE__), 'middleware', '*.rb')).each {|f| require f }
4
+
5
+ module Orange::Plugins
6
+ class Subsites < Base
7
+ views_dir File.join(File.dirname(__FILE__), 'views')
8
+
9
+ resource Orange::SubsiteResource.new
10
+
11
+ prerouter Orange::Middleware::SubsiteLoad
12
+
13
+ end
14
+ end
15
+
16
+ Orange.plugin(Orange::Plugins::Subsites.new)
17
+
@@ -0,0 +1,46 @@
1
+ module Orange
2
+ class SubsiteResource < Orange::ModelResource
3
+ use OrangeSubsite
4
+ call_me :subsites
5
+ def afterLoad
6
+ orange[:admin, true].add_link("Settings", :resource => @my_orange_name, :text => 'Subsites')
7
+ end
8
+
9
+ # Creates a new model object and saves it (if a post), then reroutes to the main page
10
+ # @param [Orange::Packet] packet the packet being routed
11
+ def new(packet, *opts)
12
+ if packet.request.post?
13
+ m = packet['site'].subsites.new(packet.request.params[@my_orange_name.to_s])
14
+ m.save
15
+ orange[:sitemap].add_route_for(packet,
16
+ :orange_site_id => packet['site'].id,
17
+ :resource => :subsites,
18
+ :resource_id => m.id,
19
+ :slug => 'subsite',
20
+ :link_text => 'Orange Subsite'
21
+ )
22
+ end
23
+ packet.reroute(@my_orange_name, :orange)
24
+ end
25
+
26
+ def url_for(packet)
27
+ orange[:sitemap].url_for(packet, {:resource => 'subsites', :resource_id => packet['subsite'].id})
28
+ end
29
+
30
+
31
+ end
32
+
33
+ class Mapper < Resource
34
+ def route_to(packet, resource, *args)
35
+ opts = args.extract_options!
36
+ packet = DefaultHash.new unless packet
37
+ context = opts[:context] || packet['route.context', nil]
38
+ site = packet['route.faked_site'] ? packet['route.site_url', nil] : nil
39
+ args.unshift(resource)
40
+ args.unshift(orange[:subsites].url_for(packet).gsub(/^\//, '').gsub(/\/$/, '')) if(packet['subsite'])
41
+ args.unshift(context)
42
+ args.unshift(site)
43
+ '/'+args.compact.join('/')
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,2 @@
1
+ %p
2
+ %a{:href => ''} Add new Subsite
@@ -0,0 +1 @@
1
+ require File.join('orange-more', 'testimonials', 'plugin')
@@ -0,0 +1,15 @@
1
+ class OrangeTestimonial < Orange::Carton
2
+ id
3
+ admin do
4
+ title :name
5
+ text :position
6
+ text :company
7
+ text :tags
8
+ fulltext :blurb
9
+ end
10
+
11
+ def self.with_tag(tag)
12
+ all(:tags.like => "%#{tag}%")
13
+ end
14
+
15
+ end
@@ -0,0 +1,13 @@
1
+ Dir.glob(File.join(File.dirname(__FILE__), 'cartons', '*.rb')).each {|f| require f }
2
+ Dir.glob(File.join(File.dirname(__FILE__), 'resources', '*.rb')).each {|f| require f }
3
+
4
+ module Orange::Plugins
5
+ class Testimonials < Base
6
+ views_dir File.join(File.dirname(__FILE__), 'views')
7
+
8
+ resource Orange::TestimonialsResource.new
9
+ end
10
+ end
11
+
12
+ Orange.plugin(Orange::Plugins::Testimonials.new)
13
+
@@ -0,0 +1,26 @@
1
+ module Orange
2
+ class TestimonialsResource < Orange::ModelResource
3
+ use OrangeTestimonial
4
+ call_me :testimonials
5
+ def afterLoad
6
+ orange[:admin, true].add_link("Content", :resource => @my_orange_name, :text => 'Testimonials')
7
+ orange.register(:stack_loaded) do
8
+ orange[:radius].context.define_tag "testimonials" do |tag|
9
+ if tag.attr["tag"] && model_class.all.count >0
10
+ m = model_class.with_tag(tag.attr["tag"]).first(:offset => rand(model_class.with_tag(tag.attr["tag"]).count)) #selects testimonial based on tag
11
+ elsif model_class.all.count > 0
12
+ m = model_class.first(:offset => rand(model_class.all.count)) #selects a random testimonial
13
+ end
14
+ unless m.nil?
15
+ orange[:testimonials].testimonial(tag.locals.packet, {:model => m })
16
+ else
17
+ ""
18
+ end
19
+ end
20
+ end
21
+ end
22
+ def testimonial(packet, opts = {})
23
+ do_view(packet, :testimonials, opts)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,4 @@
1
+ %h2 #{model.name} Said:
2
+ %h4 Position: #{model.position}
3
+ %h4 At: #{model.company}
4
+ %p= model.blurb
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: orange
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Haslem
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-02-26 00:00:00 -05:00
12
+ date: 2010-03-05 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -116,6 +116,8 @@ files:
116
116
  - lib/orange-more/administration/resources/user_resource.rb
117
117
  - lib/orange-more/administration/templates/admin.haml
118
118
  - lib/orange-more/administration/views/openid_login.haml
119
+ - lib/orange-more/administration/views/users/create.haml
120
+ - lib/orange-more/administration/views/users/edit.haml
119
121
  - lib/orange-more/assets.rb
120
122
  - lib/orange-more/assets/cartons/asset_carton.rb
121
123
  - lib/orange-more/assets/plugin.rb
@@ -144,6 +146,14 @@ files:
144
146
  - lib/orange-more/disqus/plugin.rb
145
147
  - lib/orange-more/disqus/resources/disqus_resource.rb
146
148
  - lib/orange-more/disqus/views/disqus/comment_thread.haml
149
+ - lib/orange-more/news.rb
150
+ - lib/orange-more/news/cartons/news.rb
151
+ - lib/orange-more/news/plugin.rb
152
+ - lib/orange-more/news/resources/news_resource.rb
153
+ - lib/orange-more/news/views/news/archive.haml
154
+ - lib/orange-more/news/views/news/edit.haml
155
+ - lib/orange-more/news/views/news/latest.haml
156
+ - lib/orange-more/news/views/news/sitemap_row.haml
147
157
  - lib/orange-more/pages.rb
148
158
  - lib/orange-more/pages/cartons/page_carton.rb
149
159
  - lib/orange-more/pages/cartons/page_version_carton.rb
@@ -174,6 +184,17 @@ files:
174
184
  - lib/orange-more/slices/plugin.rb
175
185
  - lib/orange-more/slices/resources/radius.rb
176
186
  - lib/orange-more/slices/resources/slices.rb
187
+ - lib/orange-more/subsites.rb
188
+ - lib/orange-more/subsites/cartons/subsite.rb
189
+ - lib/orange-more/subsites/middleware/subsite_load.rb
190
+ - lib/orange-more/subsites/plugin.rb
191
+ - lib/orange-more/subsites/resources/subsite_resource.rb
192
+ - lib/orange-more/subsites/views/subsites/index.haml
193
+ - lib/orange-more/testimonials.rb
194
+ - lib/orange-more/testimonials/cartons/testimonials_carton.rb
195
+ - lib/orange-more/testimonials/plugin.rb
196
+ - lib/orange-more/testimonials/resources/testimonials_resource.rb
197
+ - lib/orange-more/testimonials/views/testimonials/testimonials.haml
177
198
  - lib/orange.rb
178
199
  - README.markdown
179
200
  has_rdoc: true