caboose-cms 0.2.104 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZGU3N2VjMjlhNDkxY2Y4YjkxNTMwMjVlYjQ5MzZjZDJlZTMwMjMwNQ==
4
+ ZDIzNzA4ZDY1OGM5YmNjOWRiMGU4NjQxYjE1OWQ1YmJlNGRlNTA5ZA==
5
5
  data.tar.gz: !binary |-
6
- NjFmZDQ0ZTViMjIwYWUxMzlmNDliODkzZDgwMmQyNGUyOTNhMmI0Nw==
6
+ NWYxODMxNTQ0YzE1ZWQ2MjkwY2I4NWE0ZWM3Y2M4Yzg0MTAyN2E1OQ==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- NDY2Nzg4NmJhZWM3NjFlNDYyMTI5ZWNmZWIxYWRmZjRkOGFlZTNkM2EwMjZm
10
- OWI5NDQ2ZmNlNjNiNWZmMDBhZmZkMDQ1ZGY1ZjE2NTk2MTViNjljYjI3ZDcz
11
- NjNlNDE2MDNlOWM4MDA2ZmIxOGFjMjgxNDZhMTNkZjdjYTk1Y2E=
9
+ YmMyNjFmZDYxYjcyMWM3ZmQyZTE0NWQ0ZDljODkwMjQ2ZmUyZDNmZDE5ZTg3
10
+ YThlN2VlNWNlMDc4NWM0YjlkYWNlODZjNzBmNzE5ODVjNTRiNzBkOWNjNWE4
11
+ NDZiNzIyMjU5NjYwNDgyZmMyMjY5MTMzZmIyMjIzZDA2MjE2M2M=
12
12
  data.tar.gz: !binary |-
13
- ZGEzZGRiNmUzMjU0ZDQ5ZmRhZGQ4NTQwNjVmN2EwMzE2OWZmMTQ5NjZlM2Nk
14
- NzU0NGI1NmM1ZjhlZjA3YmY5MmEzY2QwNmI1MjA3OWFkY2I5ZjEwMGI0YjI0
15
- MjhiMmZmMjZjMTM5MGFjYmQ5ZWY2NDM2ODM2YmE5YzIxNjljNmE=
13
+ NTgxYjgxMDM2ZWQwZGVkNTg2NjdjMDg3ZGM3ZjliMmJlNDIyMmYyODE0ZWU2
14
+ ZTU3NDY5OThhNjhhMDZiZTdlZGQ2NWM3ZjZmOWY3ODBlMTUxMDM0NWVkYzhk
15
+ MjY4M2M2ZDFjOTM4NTU1YTFmNzEwNTJhZTA2NjI3OGExZTMxZmE=
@@ -5,11 +5,11 @@ class Caboose::Page < ActiveRecord::Base
5
5
  belongs_to :parent, :class_name => "Page"
6
6
  has_many :children, :class_name => "Page", :foreign_key => 'parent_id'
7
7
  has_many :page_permissions
8
- has_many :page_blocks
8
+ has_many :page_blocks, :order => 'sort_order'
9
9
  attr_accessible :parent_id,
10
10
  :title,
11
11
  :menu_title,
12
- :content,
12
+ # :content, # Changed from column in pages to blocks
13
13
  :blocks,
14
14
  :slug,
15
15
  :alias,
@@ -38,6 +38,14 @@ class Caboose::Page < ActiveRecord::Base
38
38
  return title unless title.nil?
39
39
  return ""
40
40
  end
41
+
42
+ def blocks
43
+ self.page_blocks
44
+ end
45
+
46
+ def content
47
+ self.blocks.collect { |b| b.content }.join("\n")
48
+ end
41
49
 
42
50
  def self.find_with_fields(page_id, fields)
43
51
  return self.where(:id => page_id).select(fields).first
@@ -3,6 +3,68 @@ class Caboose::PageBlock < ActiveRecord::Base
3
3
  self.table_name = "page_blocks"
4
4
 
5
5
  belongs_to :page
6
- attr_accessible :id, :page_id, :type, :sort_order, :name, :value
6
+ attr_accessible :id, :page_id, :block_type, :sort_order, :name, :value
7
+
8
+ def render
9
+ return self["render_#{self.block_type.downcase}".to_sym]
10
+ end
11
+
12
+ def render_richtext() return self.value end
13
+ def render_p() return "<p>#{self.value}</p>" end
14
+ def render_h1() return "<h1>#{self.value}</h1>" end
15
+ def render_h2() return "<h2>#{self.value}</h2>" end
16
+ def render_h3() return "<h3>#{self.value}</h3>" end
17
+ def render_h4() return "<h4>#{self.value}</h4>" end
18
+ def render_h5() return "<h5>#{self.value}</h5>" end
19
+ def render_h6() return "<h6>#{self.value}</h6>" end
20
+
21
+ def render_posts
22
+ obj = Caboose::StdClass(JSON.parse(self.value))
23
+ defaults = {
24
+ 'limit' => 10,
25
+ 'no_posts_message' => "<p>There are no posts right now.</p>",
26
+ 'invalid_category_message' => "<p>Invalid post category.</p>",
27
+ 'body_character_limit' => 0
28
+ }
29
+ defaults.each { |k,v| obj[k] = v if obj[k].nil? }
30
+
31
+ return obj.invalid_category_message if !Caboose::PostCategory.exists?(obj.category_id)
32
+ cat = Caboose::PostCategory.find(obj.category_id)
33
+ posts = obj.limit == 0 ? cat.posts.reorder('created_at DESC') : cat.posts.reorder('created_at DESC').limit(obj.limit)
34
+ return obj.no_posts_message posts.nil? || posts.count == 0
35
+
36
+ str = ""
37
+ posts.each do |p|
38
+ str = "<div class='post'>"
39
+ str << "<h2>#{raw p.title}</h2>"
40
+ str << "<div class='created_at'>#{p.created_at.strftime('%F %T')}</div>"
41
+ str << "<div class='post_content'>"
42
+ str << obj.body_character_limit > 0 ? Caboose.teaser_text(p.body, obj.body_character_limit) : p.body
43
+ str << "</div>"
44
+ str << "</div>"
45
+ end
46
+ end
47
+
48
+ assoc = cat
49
+ if Caboose
50
+
51
+
52
+ if Caboose::PostCategoryMembership.exists?(:post_category_id => cat.id)
53
+ Caboose::PostCategoryMembership.where(:post_category_id => cat.id)
54
+
55
+ end
56
+
57
+ end
58
+
59
+
60
+ @_renderer = "Caboose::PageBlock#{self.block_type.upcase}Renderer".constantize.new
61
+ @_renderer.page_block = self
62
+ @_renderer.page_block = self
63
+
64
+ self.renderer.render
65
+ end
66
+
67
+ @_renderer = "Caboose::PageBlock#{self.block_type.upcase}Renderer".constantize.new
68
+ @_renderer.page_block = self
7
69
 
8
70
  end
@@ -0,0 +1,12 @@
1
+
2
+ class Caboose::PageBlockRenderer
3
+
4
+ @page_block = nil
5
+
6
+ # Renders the view for the given page block
7
+ def self.render(block)
8
+ return "" if @page_block.nil?
9
+ return @page_block.value
10
+ end
11
+
12
+ end
@@ -0,0 +1,68 @@
1
+
2
+ class Caboose::PageBlockRendererRichtext
3
+
4
+ self.table_name = "page_blocks"
5
+
6
+ belongs_to :page
7
+ attr_accessible :id, :page_id, :block_type, :sort_order, :name, :value
8
+
9
+ @_renderer
10
+ def renderer
11
+ if @_renderer.nil?
12
+ @_renderer = "Caboose::PageBlock#{self.block_type.upcase}Renderer".constantize.new
13
+ @_renderer.page_block = self
14
+ end
15
+ return @_renderer
16
+ end
17
+
18
+ def render
19
+ self.renderer.render
20
+ end
21
+
22
+ def content
23
+ a = self.name.nil? || self.name.length == 0 ? '' : "<a name='#{self.name}'></a>"
24
+ return "#{a}#{self.value}" if self.block_type == 'richtext'
25
+ return "#{a}<p>#{self.value}</p>" if self.block_type == 'p'
26
+ return "#{a}<h1>#{self.value}</h1>" if self.block_type == 'h1'
27
+ return "#{a}<h2>#{self.value}</h2>" if self.block_type == 'h2'
28
+ return "#{a}<h3>#{self.value}</h3>" if self.block_type == 'h3'
29
+ return "#{a}<h4>#{self.value}</h4>" if self.block_type == 'h4'
30
+ return "#{a}<h5>#{self.value}</h5>" if self.block_type == 'h5'
31
+ return "#{a}<h6>#{self.value}</h6>" if self.block_type == 'h6'
32
+
33
+ if self.block_type == 'posts'
34
+ obj = Caboose::StdClass(JSON.parse(self.value))
35
+ defaults = {
36
+ 'limit' => 10,
37
+ 'no_posts_message' => "<p>There are no posts right now.</p>",
38
+ 'invalid_category_message' => "<p>Invalid post category.</p>",
39
+ 'body_character_limit' => 0
40
+ }
41
+ defaults.each { |k,v| obj[k] = v if obj[k].nil? }
42
+
43
+ return obj.invalid_category_message if !Caboose::PostCategory.exists?(obj.category_id)
44
+ cat = Caboose::PostCategory.find(obj.category_id)
45
+ posts = obj.limit == 0 ? cat.posts.reorder('created_at DESC') : cat.posts.reorder('created_at DESC').limit(obj.limit)
46
+ return obj.no_posts_message posts.nil? || posts.count == 0
47
+
48
+ str = ""
49
+ posts.each do |p|
50
+ str = "<div class='post'>"
51
+ str << "<h2>#{raw p.title}</h2>"
52
+ str << "<div class='created_at'>#{p.created_at.strftime('%F %T')}</div>"
53
+ str << "<div class='post_content'>"
54
+ str << obj.body_character_limit > 0 ? Caboose.teaser_text(p.body, obj.body_character_limit) : p.body
55
+ str << "</div>"
56
+ str << "</div>"
57
+ end
58
+
59
+ assoc = cat
60
+ if Caboose
61
+
62
+
63
+ if Caboose::PostCategoryMembership.exists?(:post_category_id => cat.id)
64
+ Caboose::PostCategoryMembership.where(:post_category_id => cat.id)
65
+
66
+ end
67
+
68
+ end
@@ -87,7 +87,7 @@ class Caboose::Schema < Caboose::Utilities::Schema
87
87
  ],
88
88
  Caboose::PageBlock => [
89
89
  [ :page_id , :integer ],
90
- [ :type , :string , :default => 'p' ],
90
+ [ :block_type , :string , :default => 'p' ],
91
91
  [ :sort_order , :integer , :default => 0 ],
92
92
  [ :name , :string ],
93
93
  [ :value , :text ]
@@ -127,7 +127,15 @@ class Caboose::Schema < Caboose::Utilities::Schema
127
127
  end
128
128
 
129
129
  # Loads initial data into the database
130
- def self.load_data
130
+ def self.load_data
131
+
132
+ c = ActiveRecord::Base.connection
133
+ if c.column_exists?(:pages, :content)
134
+ Caboose::Page.reorder(:id).all.each do |p|
135
+ Caboose::PageBlock.create( :page_id => p.id, :block_type => 'richtext', :value => p.content )
136
+ end
137
+ c.remove_column(:pages, :content)
138
+ end
131
139
 
132
140
  admin_user = nil
133
141
  if !Caboose::User.exists?(:username => 'admin')
@@ -3,7 +3,7 @@ class Caboose::User < ActiveRecord::Base
3
3
  #has_and_belongs_to_many :roles
4
4
  has_many :role_memberships
5
5
  has_many :roles, :through => :role_memberships
6
- attr_accessible :email, :first_name, :last_name, :username, :token, :password
6
+ attr_accessible :email, :first_name, :last_name, :username, :token, :password, :phone
7
7
 
8
8
  before_save do
9
9
  self.email = self.email.downcase if self.email
@@ -6,6 +6,11 @@ class Caboose::Utilities::Schema
6
6
  return nil
7
7
  end
8
8
 
9
+ # Columns (in order) that were renamed in the development of the gem.
10
+ def self.renamed_columns
11
+ return nil
12
+ end
13
+
9
14
  # Columns (in order) that were removed in the development of the gem.
10
15
  def self.removed_columns
11
16
  return nil
@@ -34,7 +39,8 @@ class Caboose::Utilities::Schema
34
39
  def self.create_schema
35
40
  return if self.schema.nil?
36
41
 
37
- rename_tables
42
+ rename_tables
43
+ rename_columns
38
44
 
39
45
  c = ActiveRecord::Base.connection
40
46
  self.schema.each do |model, columns|
@@ -91,6 +97,19 @@ class Caboose::Utilities::Schema
91
97
  end
92
98
  end
93
99
 
100
+ # Renames a set of columns
101
+ def self.rename_columns
102
+ return if self.renamed_columns.nil?
103
+ c = ActiveRecord::Base.connection
104
+ self.renamed_columns.each do |model, cols|
105
+ next if !c.table_exists? model.table_name
106
+ cols.each do |old_name, new_name|
107
+ next if !c.column_exists? model.table_name, old_name
108
+ c.rename_column model.table_name, old_name, new_name
109
+ end
110
+ end
111
+ end
112
+
94
113
  # Removes a set of tables
95
114
  def self.remove_columns
96
115
  return if self.removed_columns.nil?
@@ -1,9 +1,27 @@
1
1
 
2
2
  <%= render :partial => 'caboose/pages/admin_header' %>
3
3
 
4
- <p><div id='page_<%= @page.id %>_content'></div></p>
4
+ <p><input type='button' value='Add Block' onclick="add_block_at_beginning();" /></p>
5
+
6
+ <% @page.blocks.each do |b| %>
7
+ <div class='page_block'>
8
+ <div id='pageblock_<%= b.id %>_name'></div>
9
+ <div id='pageblock_<%= b.id %>_value'></div>
10
+ <div id='page_block_<%= b.id %>_message'></div>
11
+ <p><input type='button' value='Delete Block' class='delete' onclick="delete_block(<%= b.id %>);" /></p>
12
+ </div>
13
+ <p><input type='button' value='Add Block' onclick="add_block_after(<%= b.id %>);" /></p>
14
+ <% end %>
5
15
 
6
16
  <%= render :partial => 'caboose/pages/admin_footer' %>
17
+ <% content_for :caboose_css do %>
18
+ <style type='text/css'>
19
+
20
+ div.page_block { padding: 20px; border: #ccc 1px solid; background: #efefef; }
21
+ div.page_block p { padding-bottom: 0; margin-bottom: 0; }
22
+
23
+ </style>
24
+ <% end %>
7
25
  <% content_for :caboose_js do %>
8
26
  <script type='text/javascript'>
9
27
 
@@ -12,19 +30,22 @@ $(window).load(function() {
12
30
  modal = new CabooseModal(800);
13
31
  });
14
32
 
15
- $(document).ready(function() {
16
- m = new ModelBinder({
17
- name: 'Page',
18
- id: <%= @page.id %>,
19
- update_url: '/admin/pages/<%= @page.id %>',
20
- authenticity_token: '<%= form_authenticity_token %>',
21
- attributes: [
22
- { name: 'content', nice_name: 'Page Content', type: 'richtext', value: <%= raw Caboose.json(@page.content) %>, width: 800, height: 500 }
23
- ]
24
- });
33
+ $(document).ready(function() {
34
+ <% @page.blocks.each do |b| %>
35
+ m = new ModelBinder({
36
+ name: 'PageBlock',
37
+ id: <%= b.id %>,
38
+ update_url: '/admin/page-blocks/<%= b.id %>',
39
+ authenticity_token: '<%= form_authenticity_token %>',
40
+ attributes: [
41
+ { name: 'name' , nice_name: 'Name' , type: 'text' , value: <%= raw Caboose.json(b.name) %>, width: 784 },
42
+ { name: 'value', nice_name: 'Content', type: 'richtext', value: <%= raw Caboose.json(b.value) %>, width: 800, height: 300 }
43
+ ]
44
+ });
45
+ <% end %>
25
46
  });
26
47
 
27
48
  </script>
28
49
  <%= tinymce_assets %>
29
- <%= tinymce :caboose, width: '800px', height:'400px' %>
50
+ <%= tinymce :caboose, width: '800px', height:'300px' %>
30
51
  <% end %>
@@ -1,3 +1,3 @@
1
1
  module Caboose
2
- VERSION = '0.2.104'
2
+ VERSION = '0.3.1'
3
3
  end
@@ -0,0 +1,27 @@
1
+
2
+ namespace :caboose do
3
+ desc "Corrects any sequences in tables"
4
+ task :correct_sequences => :environment do
5
+
6
+ c = ActiveRecord::Base.connection
7
+ c.tables.each do |tbl|
8
+ next if !c.column_exists? tbl, :id
9
+
10
+ rows = c.execute("select max(id) from #{tbl}")
11
+ max = rows[0]['max']
12
+ max = max.to_i if !max.nil?
13
+
14
+ rows = c.execute("select nextval('#{tbl}_id_seq')")
15
+ nextval = rows[0]['nextval']
16
+ nextval = nextval.to_i if !nextval.nil?
17
+
18
+ next if max.nil? || nextval.nil?
19
+ next if nextval >= max
20
+
21
+ # If nextval is lower than the max id, then fix it.
22
+ puts "Correcting sequence for #{tbl}..."
23
+ c.execute("select setval('#{tbl}_id_seq', (select max(id) from #{tbl}))")
24
+
25
+ end
26
+ end
27
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: caboose-cms
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.104
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - William Barry
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-11 00:00:00.000000000 Z
11
+ date: 2013-12-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -187,6 +187,8 @@ files:
187
187
  - app/models/caboose/page.rb
188
188
  - app/models/caboose/page_bar_generator.rb
189
189
  - app/models/caboose/page_block.rb
190
+ - app/models/caboose/page_block_renderer.rb
191
+ - app/models/caboose/page_block_renderer_richtext.rb
190
192
  - app/models/caboose/page_permission.rb
191
193
  - app/models/caboose/pager.rb
192
194
  - app/models/caboose/permission.rb
@@ -270,6 +272,7 @@ files:
270
272
  - lib/sample_files/login.css
271
273
  - lib/sample_files/tinymce.yml
272
274
  - lib/tasks/caboose.rake
275
+ - lib/tasks/sequences.rake
273
276
  - MIT-LICENSE
274
277
  - Rakefile
275
278
  - README.md