orange 0.1.2 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
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