adva-blog 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,3 @@
1
+ class Admin::BlogsController < Admin::SectionsController
2
+ purges :create, :update, :destroy
3
+ end
@@ -0,0 +1,4 @@
1
+ class Admin::PostsController < Admin::BaseController
2
+ nested_belongs_to :site, :blog
3
+ purges :create, :update, :destroy
4
+ end
@@ -0,0 +1,20 @@
1
+ class PostsController < BaseController
2
+ nested_belongs_to :blog
3
+ before_filter :set_id, :only => :show
4
+
5
+ filtered_attributes :post if Adva.engine?(:markup)
6
+
7
+ protected
8
+
9
+ def collection
10
+ # FIXME [reference tracking] how can we remove this?
11
+ @_references << [blog, :posts] if @_references
12
+ super
13
+ end
14
+
15
+ def set_id
16
+ blog = site.blogs.find(params[:blog_id])
17
+ permalink = params[:permalink].split('/')
18
+ params[:id] = blog.posts.by_permalink(*permalink).first.try(:id)
19
+ end
20
+ end
@@ -0,0 +1,6 @@
1
+ class Blog < Section
2
+ has_many :posts, :foreign_key => 'section_id', :dependent => :destroy, :order => 'published_at DESC'
3
+ # has_option :posts_per_page, :default => 15
4
+
5
+ accepts_nested_attributes_for :posts
6
+ end
@@ -0,0 +1,25 @@
1
+ class Post < Content
2
+ has_slug :scope => :section_id
3
+
4
+ before_validation { |r| r.published_at = Time.now.to_datetime unless r.published_at }
5
+
6
+ validates_presence_of :title
7
+
8
+ class << self
9
+ def by_permalink(year, month, day, slug)
10
+ by_archive(year, month, day).where(:slug => slug)
11
+ end
12
+
13
+ def by_archive(*args)
14
+ where("DATE(contents.published_at) = ?", Date.new(*args.map(&:to_i)).to_formatted_s(:db))
15
+ end
16
+ end
17
+
18
+ def permalink
19
+ "#{published_at.year}/#{published_at.month}/#{published_at.day}/#{slug}"
20
+ end
21
+
22
+ def to_param(name)
23
+ name == :permalink ? permalink : super()
24
+ end
25
+ end
@@ -0,0 +1,3 @@
1
+ Site.class_eval do
2
+ has_many :blogs
3
+ end
@@ -0,0 +1,17 @@
1
+ class Admin::Blogs::Form < Adva::View::Form
2
+ include do
3
+ def fields
4
+ form.hidden_field :type
5
+
6
+ fieldset do
7
+ column do
8
+ form.input :name
9
+ end
10
+
11
+ column do
12
+ form.input :slug
13
+ end unless params[:action] == 'new'
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,25 @@
1
+ require_dependency 'admin/sections/_menu.html'
2
+
3
+ class Admin::Blogs::Menu < Admin::Sections::Menu
4
+ include do
5
+ def main
6
+ super
7
+ categories if persisted? && Adva.engine?(:categories)
8
+ end
9
+
10
+ def right
11
+ new_item if persisted?
12
+ super
13
+ end
14
+
15
+ protected
16
+
17
+ def show
18
+ item(:'.posts', index_path(:posts))
19
+ end
20
+
21
+ def new_item
22
+ item(:'.new_post', new_path(:post))
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,8 @@
1
+ class Admin::Blogs::Edit < Minimal::Template
2
+ include do
3
+ def to_html
4
+ h2 :'.title'
5
+ render :partial => 'form'
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ class Admin::Blogs::New < Minimal::Template
2
+ include do
3
+ def to_html
4
+ h2 :'.title'
5
+ render 'admin/sections/select_type'
6
+ render :partial => 'form'
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,41 @@
1
+ class Admin::Blogs::Show < Minimal::Template
2
+ include do
3
+ def to_html
4
+ table_for resource.posts do |t|
5
+ t.column :post, :comments, :published, :author, :actions
6
+
7
+ t.row do |r, post|
8
+ r.cell link_to_post(post)
9
+ r.cell ''.html_safe # post.accept_comments? && post.comments.present? ? link_to(post.comments.size, admin_comments_path) : t(:"adva.common.none")
10
+ r.cell ''.html_safe # published_at_formatted(post)
11
+ r.cell link_to_author(post)
12
+ r.cell links_to_actions([:view, :edit, :destroy], post)
13
+ end
14
+
15
+ t.foot.row do |r|
16
+ # r.cell will_paginate(@posts), :class => :pagination, :colspan => :all
17
+ end
18
+
19
+ t.empty :p, :class => 'posts list empty' do
20
+ self.t(:'.empty', :link => capture { link_to(:'.create_item', new_path(:post)) }).html_safe
21
+ end
22
+ end
23
+ end
24
+
25
+ def link_to_post(post)
26
+ status(post) + capture { link_to_edit(post.title, post) } # , :class => post.state
27
+ end
28
+
29
+ def link_to_author(post)
30
+ ''.html_safe # link_to(post.author_name, admin_site_user_path(@site, post.author))
31
+ end
32
+
33
+ def link_to_view(post)
34
+ capture { link_to(options[:text] || :'.view', public_url_for([post.section, post]), :class => :view) }
35
+ end
36
+
37
+ def status(post)
38
+ capture { span(t(:'.published'), :title => t(:'.published'), :class => 'status published') }
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,22 @@
1
+ require_dependency 'admin/categories/_menu.html'
2
+
3
+ Admin::Categories::Menu.class_eval do
4
+ include do
5
+ def main
6
+ super
7
+ posts if blog?
8
+ end
9
+
10
+ protected
11
+
12
+ def posts
13
+ item(:'.posts', index_parent_path(:posts), :before => :'.categories')
14
+ end
15
+
16
+ def blog?
17
+ resource.section.is_a?(Blog)
18
+ end
19
+ end
20
+ end
21
+
22
+
@@ -0,0 +1,18 @@
1
+ class Admin::Posts::Form < Adva::View::Form
2
+ include do
3
+ def fields
4
+ fieldset do
5
+ form.input :title
6
+ form.input :body
7
+ end
8
+ end
9
+
10
+ def sidebar
11
+ categories_tab(blog.categories) if Adva.engine?(:categories)
12
+
13
+ tab :options do
14
+ form.input :slug
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,10 @@
1
+ require_dependency 'admin/contents/_menu.html'
2
+
3
+ class Admin::Posts::Menu < Admin::Contents::Menu
4
+ include do
5
+ def main
6
+ super
7
+ categories(index_parent_path(:categories), :before => :'.edit_section') if Adva.engine?(:categories)
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,8 @@
1
+ class Admin::Posts::Edit < Minimal::Template
2
+ include do
3
+ def to_html
4
+ h2 :'.title'
5
+ render :partial => 'form'
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,42 @@
1
+ class Admin::Posts::Index < Minimal::Template
2
+ include do
3
+ def to_html
4
+ table_for collection do |t|
5
+ t.column :post, :comments, :published, :author, :actions
6
+
7
+ t.row do |r, post|
8
+ r.cell link_to_post(post)
9
+ r.cell ''.html_safe # post.accept_comments? && post.comments.present? ? link_to(post.comments.size, admin_comments_path) : t(:"adva.common.none")
10
+ r.cell ''.html_safe # published_at_formatted(post)
11
+ r.cell link_to_author(post)
12
+ r.cell links_to_actions([:view, :edit, :destroy], post)
13
+ end
14
+
15
+ t.foot.row do |r|
16
+ # r.cell will_paginate(@posts), :class => :pagination, :colspan => :all
17
+ end
18
+
19
+ t.empty :p, :class => 'posts list empty' do
20
+ self.t(:'.empty', :link => capture { link_to(:'.create_item', new_path) }).html_safe
21
+ end
22
+ end
23
+ end
24
+
25
+ def link_to_post(post)
26
+ status(post) + capture { link_to_edit(post.title, post) } # , :class => post.state
27
+ end
28
+
29
+ def link_to_author(post)
30
+ ''.html_safe # link_to(post.author_name, admin_site_user_path(@site, post.author))
31
+ end
32
+
33
+ def link_to_view(post)
34
+ capture { link_to(options[:text] || :'.actions.view', public_url_for([blog, post]), :class => :view) }
35
+ end
36
+
37
+ def status(post)
38
+ capture { span(t(:'.status.published'), :title => t(:'.status.published'), :class => 'status published') }
39
+ end
40
+ end
41
+ end
42
+
@@ -0,0 +1,8 @@
1
+ class Admin::Posts::New < Minimal::Template
2
+ include do
3
+ def to_html
4
+ h2 :'.title'
5
+ render :partial => 'form'
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,13 @@
1
+ class Posts::Meta < Minimal::Template
2
+ include do
3
+ def to_html
4
+ div :class => :meta do
5
+ self << t(:'.info_html', :date => published_at, :author => nil)
6
+ end
7
+ end
8
+
9
+ def published_at
10
+ capture { content_tag(:abbr, l(post.published_at, :format => :post), :title => post.published_at, :class => 'updated') }
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,22 @@
1
+ class Posts::Index < Minimal::Template
2
+ include do
3
+ def to_html
4
+ ul :class => 'blog posts' do
5
+ collection.each do |post|
6
+ li :class => 'post hentry' do
7
+ h2 do
8
+ link_to(post.title, [post.section, post], :class => 'entry-title', :rel => 'bookmark')
9
+ end
10
+ render :partial => 'posts/meta', :locals => { :post => post }
11
+ div truncate_html(post.body, :length => 500, :omission => ' …'), :class => 'entry-content'
12
+ p do
13
+ link_to(:'.continue', [post.section, post], :class => :continue)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+
@@ -0,0 +1,11 @@
1
+ class Posts::Show < Minimal::Template
2
+ include do
3
+ def to_html
4
+ div :class => resource.class.name.underscore do
5
+ h2 { link_to(resource.title, resources, :class => 'entry-title', :rel => 'bookmark') }
6
+ render :partial => 'posts/meta', :locals => { :post => resource }
7
+ self << resource.body.html_safe
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,38 @@
1
+ en:
2
+ time:
3
+ formats:
4
+ post: "%a, %d %b %Y"
5
+
6
+ section:
7
+ types:
8
+ blog: Blog
9
+
10
+ menu:
11
+ posts: Posts
12
+ new_post: New Post
13
+
14
+ columns:
15
+ post: Post
16
+ comments: Comments
17
+
18
+ posts:
19
+ index:
20
+ continue: Read the rest of this post
21
+ meta:
22
+ info_html: "posted on %{date}"
23
+
24
+ admin:
25
+ blogs:
26
+ new:
27
+ title: Create a New Section
28
+ edit:
29
+ title: Settings
30
+ posts:
31
+ index:
32
+ empty: "There are no posts. %{link}"
33
+ create_item: "Create one now &raquo;"
34
+ new:
35
+ title: Write a new blog post
36
+ edit:
37
+ title: Edit Post
38
+ delete: Delete
@@ -0,0 +1,8 @@
1
+ Adva::Registry.set :redirect, {
2
+ 'admin/blogs#create' => lambda { |c| c.index_path(:posts) },
3
+ 'admin/blogs#update' => lambda { |c| c.edit_url },
4
+
5
+ 'admin/posts#create' => lambda { |c| c.edit_url },
6
+ 'admin/posts#update' => lambda { |c| c.edit_url },
7
+ 'admin/posts#destroy' => lambda { |c| c.index_url }
8
+ }
data/config/routes.rb ADDED
@@ -0,0 +1,22 @@
1
+ Rails.application.routes.draw do
2
+ # overwrite admin/blog#show to point to admin/posts#index instead
3
+ # can this be simplified? haven't had any luck putting it into the resource block
4
+ get 'admin/sites/:site_id/blogs/:blog_id', :to => 'admin/posts#index', :as => 'admin_site_blog'
5
+
6
+ namespace :admin do
7
+ resources :sites do
8
+ resources :blogs do
9
+ resources :posts
10
+ end
11
+ end
12
+ end
13
+
14
+ constraints :year => /\d{4}/, :month => /\d{1,2}/, :day => /\d{1,2}/ do
15
+ get 'blogs/:blog_id(/:year(/:month(/:day)))', :to => 'posts#index', :as => :blog
16
+ end
17
+
18
+ constraints :permalink => %r(\d{4}/\d{1,2}/\d{1,2}/w+) do
19
+ get 'blogs/:blog_id/*permalink.:format', :to => "posts#show"
20
+ get 'blogs/:blog_id/*permalink', :to => "posts#show", :as => :blog_post
21
+ end
22
+ end
data/lib/adva/blog.rb ADDED
@@ -0,0 +1,29 @@
1
+ require 'adva/core'
2
+ require 'adva/engine'
3
+
4
+ require 'routing_filter'
5
+ require 'adva/routing_filters/section_root'
6
+
7
+ require 'action_controller' # really should be in truncate_html
8
+ require 'truncate_html'
9
+
10
+ module Adva
11
+ class Blog < ::Rails::Engine
12
+ include Adva::Engine
13
+
14
+ initializer 'adva-blog.require_section_types' do
15
+ config.to_prepare { require_dependency 'blog' }
16
+ end
17
+
18
+ initializer 'adva-blog.configure_routing_filters' do
19
+ RoutingFilter::SectionRoot.anchors << '\d{4}'
20
+ end
21
+
22
+ initializer 'adva-blog.register_asset_expansions' do
23
+ ActionView::Helpers::AssetTagHelper.register_stylesheet_expansion(
24
+ :default => %w( adva-blog/default/styles )
25
+ )
26
+ end
27
+ end
28
+ end
29
+
data/lib/adva-blog.rb ADDED
@@ -0,0 +1 @@
1
+ require 'adva/blog'
@@ -0,0 +1,3 @@
1
+ module AdvaBlog
2
+ VERSION = "0.0.4"
3
+ end
@@ -0,0 +1,9 @@
1
+ Factory.define :blog, :parent => :section, :class => Blog do |f|
2
+ f.name 'Blog'
3
+ end
4
+
5
+ Factory.define :post do |f|
6
+ f.section Blog.first
7
+ f.title 'Title'
8
+ f.body 'Body'
9
+ end
@@ -0,0 +1,19 @@
1
+ module Adva::Blog::Paths
2
+ def path_to(page)
3
+ case page
4
+
5
+ when /^the admin posts list page of the "([^"]*)" blog$/
6
+ section = Blog.find_by_name($1) || raise("could not find blog #{$1.inspect}")
7
+ polymorphic_path([:admin, section.site, section])
8
+
9
+ when /^the admin edit post page for the post "([^"]*)"$/
10
+ post = Post.find_by_title($1) || raise("could not find post #{$1.inspect}")
11
+ polymorphic_path([:edit, :admin, post.section.site, post.section, post])
12
+
13
+ else
14
+ super
15
+ end
16
+ end
17
+ end
18
+
19
+ World(Adva::Blog::Paths)
@@ -0,0 +1,19 @@
1
+ .posts {
2
+ padding-top: 0;
3
+ margin-left: 0;
4
+ list-style-type: none;
5
+ }
6
+ .post {
7
+ padding-bottom: 1em;
8
+ }
9
+ .meta {
10
+ font-size: 10pt;
11
+ color: #999;
12
+ }
13
+ .continue {
14
+ font-size: 10pt;
15
+ }
16
+ .continue:after {
17
+ content: " \2192";
18
+ }
19
+
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adva-blog
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 3
10
- version: 0.0.3
9
+ - 4
10
+ version: 0.0.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Ingo Weiss
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2010-11-19 00:00:00 +01:00
19
+ date: 2010-12-03 00:00:00 +01:00
20
20
  default_executable:
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
@@ -56,7 +56,35 @@ extensions: []
56
56
  extra_rdoc_files: []
57
57
 
58
58
  files:
59
- - lib/bundler/repository.rb
59
+ - app/controllers/posts_controller.rb
60
+ - app/controllers/admin/blogs_controller.rb
61
+ - app/controllers/admin/posts_controller.rb
62
+ - app/views/admin/categories/_menu_slice.html.rb
63
+ - app/views/admin/blogs/show.html.rb
64
+ - app/views/admin/blogs/edit.html.rb
65
+ - app/views/admin/blogs/new.html.rb
66
+ - app/views/admin/blogs/_form.html.rb
67
+ - app/views/admin/blogs/_menu.html.rb
68
+ - app/views/admin/posts/index.html.rb
69
+ - app/views/admin/posts/edit.html.rb
70
+ - app/views/admin/posts/new.html.rb
71
+ - app/views/admin/posts/_form.html.rb
72
+ - app/views/admin/posts/_menu.html.rb
73
+ - app/views/posts/index.html.rb
74
+ - app/views/posts/show.html.rb
75
+ - app/views/posts/_meta.html.rb
76
+ - app/models/post.rb
77
+ - app/models/site_slice.rb
78
+ - app/models/blog.rb
79
+ - config/redirects.rb
80
+ - config/routes.rb
81
+ - config/locales/en.yml
82
+ - lib/adva_blog/version.rb
83
+ - lib/adva/blog.rb
84
+ - lib/testing/factories.rb
85
+ - lib/testing/paths.rb
86
+ - lib/adva-blog.rb
87
+ - public/stylesheets/adva-blog/default/styles.css
60
88
  has_rdoc: true
61
89
  homepage: http://github.com/svenfuchs/adva-cms2
62
90
  licenses: []
@@ -1,118 +0,0 @@
1
- require 'pathname'
2
-
3
- # Bundler gemfile support for local/remote workspaces/repositories for work in
4
- # development teams.
5
- #
6
- # Usage:
7
- #
8
- # # define paths to be searched for repositories:
9
- # workspace '~/.projects ~/Development/{projects,work}'
10
- #
11
- # # define developer preferences for using local or remote repositories (uses ENV['user']):
12
- # developer :sven, :prefer => :local
13
- #
14
- # # define repositories to be used for particular gems:
15
- # adva_cms = repository('adva-cms2', :git => 'git@github.com:svenfuchs/adva-cms2.git', :ref => 'c2af0de')
16
- # adva_shop = repository('adva-shop', :source => :local)
17
- #
18
- # # now use repositories to define gems:
19
- # adva_cms.gem 'adva-core'
20
- # adva_shop.gem 'adva-catalog'
21
- #
22
- # # The gem definition will now be proxied to Bundler with arguments according
23
- # # to the setup defined earlier. E.g. as:
24
- #
25
- # gem 'adva-core', :path => 'Development/projects/adva-cms2/adva-core' # for developer 'sven'
26
- # gem 'adva-core', :git => 'git@github.com:svenfuchs/adva-cms2.git', :ref => 'c2af0de' # for other developers
27
- # gem 'adva-catalog', :path => 'Development/projects/adva-shop/adva-catalog' # for all developers
28
- #
29
- # One can also set an environment variable FORCE_REMOTE which will force remote
30
- # repositories to be used *except* when a repository was defined with :source => :local
31
- # which always forces the local repository to be used.
32
- #
33
- class Repository
34
- class << self
35
- def paths
36
- @paths ||= []
37
- end
38
-
39
- def path(*paths)
40
- paths.join(' ').split(' ').each do |path|
41
- self.paths.concat(Pathname.glob(File.expand_path(path)))
42
- end
43
- end
44
-
45
- def developer(name, preferences)
46
- developers[name] = preferences
47
- workspaces(preferences[:workspace])
48
- end
49
-
50
- def current_developer
51
- developers[ENV['USER'].to_sym] || {}
52
- end
53
-
54
- def developers(developers = nil)
55
- @developers ||= {}
56
- end
57
- end
58
-
59
- class Gem < Array
60
- def initialize(name, repository)
61
- if repository.local?
62
- sub_path = repository.path.join(name)
63
- super([name, { :path => sub_path.exist? ? sub_path.to_s : repository.path.to_s }])
64
- else
65
- super([name, repository.options.dup])
66
- end
67
- end
68
- end
69
-
70
- attr_reader :bundler, :name, :options, :source
71
-
72
- def initialize(bundler, name, options)
73
- @bundler = bundler
74
- @name = name
75
- @source = options.delete(:source)
76
- @options = options
77
- end
78
-
79
- def gem(name)
80
- bundler.gem(*Gem.new(name, self))
81
- end
82
-
83
- def local?
84
- source == :local # && path
85
- end
86
-
87
- def source
88
- @source ||= forced_source || preferred_source || :remote
89
- end
90
-
91
- def forced_source
92
- :remote if ENV['FORCE_REMOTE']
93
- end
94
-
95
- def preferred_source
96
- self.class.current_developer[:prefer] || self.class.current_developer[name.to_sym]
97
- end
98
-
99
- def path
100
- @path ||= begin
101
- path = self.class.paths.detect { |path| path.join(name).exist? }
102
- path ? path.join(name) : Pathname.new('.')
103
- end
104
- end
105
- end
106
-
107
- def workspace(*paths)
108
- Repository.path(*paths)
109
- end
110
- alias :workspaces :workspace
111
-
112
- def developer(name, preferences)
113
- Repository.developer(name, preferences)
114
- end
115
-
116
- def repository(*args)
117
- Repository.new(self, *args)
118
- end