sunrise-posts 0.1.0
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/README.rdoc +7 -0
- data/Rakefile +46 -0
- data/app/controllers/manage/posts_controller.rb +38 -0
- data/app/sweepers/post_sweeper.rb +22 -0
- data/app/views/manage/posts/_form.html.erb +13 -0
- data/app/views/manage/posts/_model_filter.html.erb +29 -0
- data/app/views/manage/posts/_post.html.erb +31 -0
- data/app/views/manage/posts/edit.html.erb +6 -0
- data/app/views/manage/posts/index.html.erb +37 -0
- data/app/views/manage/posts/new.html.erb +6 -0
- data/config/routes.rb +7 -0
- data/lib/generators/sunrise/posts/USAGE +11 -0
- data/lib/generators/sunrise/posts/install_generator.rb +34 -0
- data/lib/generators/sunrise/posts/templates/create_posts.rb +24 -0
- data/lib/generators/sunrise/posts/templates/post.rb +7 -0
- data/lib/sunrise/models/post.rb +43 -0
- data/lib/sunrise/posts/engine.rb +18 -0
- data/lib/sunrise/posts/version.rb +5 -0
- data/lib/sunrise/posts.rb +12 -0
- data/lib/sunrise-posts.rb +2 -0
- metadata +98 -0
data/README.rdoc
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'rake'
|
3
|
+
require 'rake/testtask'
|
4
|
+
require 'rake/rdoctask'
|
5
|
+
require File.join(File.dirname(__FILE__), 'lib', 'sunrise', 'posts', 'version')
|
6
|
+
|
7
|
+
desc 'Default: run unit tests.'
|
8
|
+
task :default => :test
|
9
|
+
|
10
|
+
desc 'Test the sunrise plugin.'
|
11
|
+
Rake::TestTask.new(:test) do |t|
|
12
|
+
t.libs << 'lib'
|
13
|
+
t.libs << 'test'
|
14
|
+
t.pattern = 'test/**/*_test.rb'
|
15
|
+
t.verbose = true
|
16
|
+
end
|
17
|
+
|
18
|
+
desc 'Generate documentation for the sunrise plugin.'
|
19
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
20
|
+
rdoc.rdoc_dir = 'rdoc'
|
21
|
+
rdoc.title = 'Sunrise Posts'
|
22
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
23
|
+
rdoc.rdoc_files.include('README')
|
24
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
25
|
+
end
|
26
|
+
|
27
|
+
begin
|
28
|
+
require 'jeweler'
|
29
|
+
Jeweler::Tasks.new do |s|
|
30
|
+
s.name = "sunrise-posts"
|
31
|
+
s.version = Sunrise::Posts::VERSION.dup
|
32
|
+
s.summary = "Rails CMS"
|
33
|
+
s.description = "Sunrise is a Aimbulance CMS"
|
34
|
+
s.email = "galeta.igor@gmail.com"
|
35
|
+
s.homepage = "https://github.com/galetahub/sunrise-posts"
|
36
|
+
s.authors = ["Igor Galeta", "Pavlo Galeta"]
|
37
|
+
s.files = FileList["[A-Z]*", "{app,config,lib}/**/*"]
|
38
|
+
s.extra_rdoc_files = FileList["[A-Z]*"] - %w(Gemfile Rakefile)
|
39
|
+
|
40
|
+
s.add_dependency('sunrise')
|
41
|
+
end
|
42
|
+
|
43
|
+
Jeweler::GemcutterTasks.new
|
44
|
+
rescue LoadError
|
45
|
+
puts "Jeweler not available. Install it with: gem install jeweler"
|
46
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
class Manage::PostsController < Manage::BaseController
|
2
|
+
inherit_resources
|
3
|
+
defaults :route_prefix => 'manage'
|
4
|
+
actions :all, :except => [:show]
|
5
|
+
belongs_to :structure
|
6
|
+
|
7
|
+
load_and_authorize_resource :post, :through => :structure
|
8
|
+
|
9
|
+
before_filter :make_filter, :only => [:index]
|
10
|
+
cache_sweeper :post_sweeper, :only => [:create, :update, :destroy]
|
11
|
+
|
12
|
+
def create
|
13
|
+
create!{ manage_structure_posts_path(@structure.id) }
|
14
|
+
end
|
15
|
+
|
16
|
+
def update
|
17
|
+
update!{ manage_structure_posts_path(@structure.id) }
|
18
|
+
end
|
19
|
+
|
20
|
+
def destroy
|
21
|
+
destroy!{ manage_structure_posts_path(@structure.id) }
|
22
|
+
end
|
23
|
+
|
24
|
+
protected
|
25
|
+
|
26
|
+
def begin_of_association_chain
|
27
|
+
@structure
|
28
|
+
end
|
29
|
+
|
30
|
+
def collection
|
31
|
+
@posts = (@posts || end_of_association_chain).merge(@search.scoped).page(params[:page])
|
32
|
+
end
|
33
|
+
|
34
|
+
def make_filter
|
35
|
+
@search = Sunrise::ModelFilter.new(Post, :attributes=>[ :title, :kind ] )
|
36
|
+
@search.update_attributes(params[:search])
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class PostSweeper < ActionController::Caching::Sweeper
|
2
|
+
observe Post
|
3
|
+
|
4
|
+
def after_create(item)
|
5
|
+
expire(item)
|
6
|
+
end
|
7
|
+
|
8
|
+
def after_update(item)
|
9
|
+
expire(item)
|
10
|
+
end
|
11
|
+
|
12
|
+
def after_destroy(item)
|
13
|
+
expire(item)
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def expire(item=nil)
|
19
|
+
expire_fragment(%r{/posts})
|
20
|
+
StructureSweeper.sweep!
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<%= manage_form_for @post, :url => @post.new_record? ? manage_structure_posts_path(@structure.id) : manage_structure_post_path(@structure.id, @post.id) do |f| %>
|
2
|
+
<div class="edit-cont">
|
3
|
+
<div class="inputs-bl">
|
4
|
+
<%= f.input :title, :input_html => { :class => "text name" } %>
|
5
|
+
|
6
|
+
<%= f.input :published_at %>
|
7
|
+
|
8
|
+
<%= f.ckeditor :content, :input_html => options_for_ckeditor(:width => 860) %>
|
9
|
+
</div>
|
10
|
+
</div>
|
11
|
+
|
12
|
+
<%= f.button :submit, :url => manage_structure_posts_path(@structure.id) %>
|
13
|
+
<% end %>
|
@@ -0,0 +1,29 @@
|
|
1
|
+
<div class="bot-bg">
|
2
|
+
<div class="filt-bl">
|
3
|
+
<%= link_to_function t('manage.model_filter.title'), "Manage.toggle_element('block_filter')", :class=>"dark-arr" %>
|
4
|
+
|
5
|
+
<%= cookie_content_tag(:div, :id=>"block_filter", :class=>"filt") do %>
|
6
|
+
<%= form_for @search, :as => :search, :url=>manage_structure_posts_path(@structure.id), :html=>{:method=>:get, :id=>"form_filter"} do |f| %>
|
7
|
+
<%= f.label :title, t('activerecord.attributes.post.title') %>
|
8
|
+
<%= f.text_field :title, :class=>"text" %>
|
9
|
+
|
10
|
+
<div class="buts">
|
11
|
+
<%= f.submit t('manage.model_filter.search'), :style=>"display:none;" %>
|
12
|
+
<%= link_to_function content_tag(:span, t('manage.model_filter.search')), "$('#form_filter').submit()", :class=>"gr" %>
|
13
|
+
<%= link_to t('manage.model_filter.clear'), manage_structure_posts_path(@structure.id), :class=>"erase" %>
|
14
|
+
</div>
|
15
|
+
<% end %>
|
16
|
+
<% end %>
|
17
|
+
</div>
|
18
|
+
<div class="sort">
|
19
|
+
<label><%= t('manage.sort') %></label>
|
20
|
+
<div class="select-input"><%= link_to_function t("manage.posts.sort.#{@search.order_column}_#{@search.next_order_type}"), "SelectList.toggle(event)", :class=>"corn", :id=>'sort_select' %></div>
|
21
|
+
<div id='sort_select_list' class="select-list" style='display:none;'>
|
22
|
+
<%= link_to_sort(t('manage.posts.sort.created_at_desc'), :name => "created_at", :order_type => 'desc') %>
|
23
|
+
<%= link_to_sort(t('manage.posts.sort.created_at_asc'), :name=>"created_at", :order_type=>'asc') %>
|
24
|
+
|
25
|
+
<%= link_to_sort(t('manage.posts.sort.title_desc'), :name=>"title", :order_type=>'desc') %>
|
26
|
+
<%= link_to_sort(t('manage.posts.sort.title_asc'), :name=>"title", :order_type=>'asc') %>
|
27
|
+
</div>
|
28
|
+
</div>
|
29
|
+
</div>
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<%= content_tag(:div, :id => dom_id(post), :class=>"dinamic-bl") do %>
|
2
|
+
<div class="act-bl" style="display:none;">
|
3
|
+
<% if can? :update, post, :context => :manage %>
|
4
|
+
<%= link_to image_tag("manage/ico_edit.gif", :title=>t('manage.edit')), edit_manage_structure_post_path(@structure.id, post.id), :class=>"icons" %>
|
5
|
+
<% end %>
|
6
|
+
|
7
|
+
<% if can? :delete, post, :context => :manage %>
|
8
|
+
<%= link_to image_tag("manage/ico_del.gif", :title=>t('manage.delete')), manage_structure_post_path(@structure.id, post.id),
|
9
|
+
:method=>:delete, :confirm=>t("manage.confirm_delete"), :class=>"icons" %>
|
10
|
+
<% end %>
|
11
|
+
</div>
|
12
|
+
|
13
|
+
<div class="bot-bg">
|
14
|
+
<div class="dinamic-container">
|
15
|
+
<div class="right-data">
|
16
|
+
<div class="right-data-cont">
|
17
|
+
<div class="dinamic-inner">
|
18
|
+
<div class="r-block">
|
19
|
+
<div class="r-block-cont">
|
20
|
+
<%= link_to post.title, edit_manage_structure_post_path(@structure.id, post.id), :class=>"title" %>
|
21
|
+
</div>
|
22
|
+
</div>
|
23
|
+
</div>
|
24
|
+
</div>
|
25
|
+
</div>
|
26
|
+
<div class="left-data">
|
27
|
+
<span class="data"><%= raw I18n.l(post.created_at, :format=>"<span>%d/%m</span>%Y") %></span>
|
28
|
+
</div>
|
29
|
+
</div>
|
30
|
+
</div>
|
31
|
+
<% end %>
|
@@ -0,0 +1,37 @@
|
|
1
|
+
<div class="duo-bl">
|
2
|
+
<div class="left-part">
|
3
|
+
<div class="content">
|
4
|
+
<div class="row-container">
|
5
|
+
<div class="white-row">
|
6
|
+
<div class="r-corn">
|
7
|
+
<%= link_to @structure.title, manage_structure_posts_path(@structure.id), :class=>"dark-text" %>
|
8
|
+
|
9
|
+
<div class="act-bl">
|
10
|
+
<% if can? :create, Post, :context => :manage %>
|
11
|
+
<%= link_to t('manage.add'), new_manage_structure_post_path(@structure.id), :class=>"create" %>
|
12
|
+
<% end %>
|
13
|
+
</div>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
|
18
|
+
<div id="posts" class="stage">
|
19
|
+
<%= render :partial=>"manage/posts/post", :collection=>@posts %>
|
20
|
+
<%= paginate @posts %>
|
21
|
+
</div>
|
22
|
+
|
23
|
+
<script type='text/javascript'>
|
24
|
+
$(document).ready(function(){
|
25
|
+
Manage.init_collection('posts', 'dinamic-bl');
|
26
|
+
});
|
27
|
+
</script>
|
28
|
+
|
29
|
+
</div>
|
30
|
+
</div>
|
31
|
+
|
32
|
+
<div class="right-part">
|
33
|
+
<div class="filter-right">
|
34
|
+
<%= render :partial=>"manage/posts/model_filter" %>
|
35
|
+
</div>
|
36
|
+
</div>
|
37
|
+
</div>
|
data/config/routes.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
require 'rails/generators/migration'
|
3
|
+
|
4
|
+
module Sunrise
|
5
|
+
module Posts
|
6
|
+
class InstallGenerator < Rails::Generators::Base
|
7
|
+
include Rails::Generators::Migration
|
8
|
+
|
9
|
+
source_root File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
|
10
|
+
class_option :migrations, :type => :boolean, :default => true, :description => "Generate migrations files"
|
11
|
+
|
12
|
+
desc "Generates post migration and model"
|
13
|
+
|
14
|
+
def self.current_time
|
15
|
+
@current_time ||= Time.now
|
16
|
+
@current_time += 1.minute
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.next_migration_number(dirname)
|
20
|
+
current_time.strftime("%Y%m%d%H%M%S")
|
21
|
+
end
|
22
|
+
|
23
|
+
def create_model
|
24
|
+
copy_file('post.rb', 'app/models/post.rb')
|
25
|
+
end
|
26
|
+
|
27
|
+
def create_migration
|
28
|
+
if options.migrations
|
29
|
+
migration_template "create_posts.rb", File.join('db/migrate', "sunrise_create_posts.rb")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class SunriseCreatePosts < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :posts do |t|
|
4
|
+
t.integer :structure_id
|
5
|
+
t.string :title, :null => false
|
6
|
+
# t.string :slug, :limit=>40, :null=>false
|
7
|
+
t.text :content
|
8
|
+
|
9
|
+
t.integer :kind, :limit => 1, :default => 0
|
10
|
+
t.integer :comments_count, :default=>0
|
11
|
+
t.integer :year, :limit => 4
|
12
|
+
|
13
|
+
t.datetime :published_at
|
14
|
+
t.timestamps
|
15
|
+
end
|
16
|
+
|
17
|
+
add_index :posts, :structure_id
|
18
|
+
add_index :posts, :year
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.down
|
22
|
+
drop_table :posts
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Sunrise
|
3
|
+
module Models
|
4
|
+
module Post
|
5
|
+
def self.included(base)
|
6
|
+
base.send :include, InstanceMethods
|
7
|
+
base.send :extend, ClassMethods
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
def self.extended(base)
|
12
|
+
base.send(:include, Utils::Header)
|
13
|
+
base.class_eval do
|
14
|
+
belongs_to :structure
|
15
|
+
has_many :comments, :as => :commentable, :dependent => :delete_all
|
16
|
+
|
17
|
+
validates_presence_of :title, :content
|
18
|
+
|
19
|
+
before_save :make_date
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
module InstanceMethods
|
25
|
+
|
26
|
+
def content_without_html
|
27
|
+
return nil if self.content.blank?
|
28
|
+
self.content.no_html
|
29
|
+
end
|
30
|
+
|
31
|
+
protected
|
32
|
+
|
33
|
+
def make_date
|
34
|
+
self.published_at ||= Time.now
|
35
|
+
|
36
|
+
self.year = self.published_at.year if respond_to?(:year)
|
37
|
+
self.month = self.published_at.month if respond_to?(:month)
|
38
|
+
self.day = self.published_at.day if respond_to?(:day)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'rails'
|
2
|
+
require 'sunrise-posts'
|
3
|
+
|
4
|
+
module Sunrise
|
5
|
+
module Posts
|
6
|
+
class Engine < ::Rails::Engine
|
7
|
+
config.after_initialize do
|
8
|
+
Sunrise::Plugin.register :posts do |plugin|
|
9
|
+
plugin.model = 'sunrise/models/post'
|
10
|
+
plugin.menu = false
|
11
|
+
plugin.version = Sunrise::Posts::VERSION.dup
|
12
|
+
end
|
13
|
+
|
14
|
+
Sunrise::Plugins.activate(:posts)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
metadata
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sunrise-posts
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Igor Galeta
|
14
|
+
- Pavlo Galeta
|
15
|
+
autorequire:
|
16
|
+
bindir: bin
|
17
|
+
cert_chain: []
|
18
|
+
|
19
|
+
date: 2011-05-18 00:00:00 Z
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: sunrise
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
version: "0"
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
35
|
+
description: Sunrise is a Aimbulance CMS
|
36
|
+
email: galeta.igor@gmail.com
|
37
|
+
executables: []
|
38
|
+
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files:
|
42
|
+
- README.rdoc
|
43
|
+
files:
|
44
|
+
- README.rdoc
|
45
|
+
- Rakefile
|
46
|
+
- app/controllers/manage/posts_controller.rb
|
47
|
+
- app/sweepers/post_sweeper.rb
|
48
|
+
- app/views/manage/posts/_form.html.erb
|
49
|
+
- app/views/manage/posts/_model_filter.html.erb
|
50
|
+
- app/views/manage/posts/_post.html.erb
|
51
|
+
- app/views/manage/posts/edit.html.erb
|
52
|
+
- app/views/manage/posts/index.html.erb
|
53
|
+
- app/views/manage/posts/new.html.erb
|
54
|
+
- config/routes.rb
|
55
|
+
- lib/generators/sunrise/posts/USAGE
|
56
|
+
- lib/generators/sunrise/posts/install_generator.rb
|
57
|
+
- lib/generators/sunrise/posts/templates/create_posts.rb
|
58
|
+
- lib/generators/sunrise/posts/templates/post.rb
|
59
|
+
- lib/sunrise-posts.rb
|
60
|
+
- lib/sunrise/models/post.rb
|
61
|
+
- lib/sunrise/posts.rb
|
62
|
+
- lib/sunrise/posts/engine.rb
|
63
|
+
- lib/sunrise/posts/version.rb
|
64
|
+
homepage: https://github.com/galetahub/sunrise-posts
|
65
|
+
licenses: []
|
66
|
+
|
67
|
+
post_install_message:
|
68
|
+
rdoc_options: []
|
69
|
+
|
70
|
+
require_paths:
|
71
|
+
- lib
|
72
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
hash: 3
|
78
|
+
segments:
|
79
|
+
- 0
|
80
|
+
version: "0"
|
81
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
hash: 3
|
87
|
+
segments:
|
88
|
+
- 0
|
89
|
+
version: "0"
|
90
|
+
requirements: []
|
91
|
+
|
92
|
+
rubyforge_project:
|
93
|
+
rubygems_version: 1.8.2
|
94
|
+
signing_key:
|
95
|
+
specification_version: 3
|
96
|
+
summary: Rails CMS
|
97
|
+
test_files: []
|
98
|
+
|