cortex-reaver 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +25 -0
- data/README +48 -0
- data/bin/console +11 -0
- data/bin/cortex_reaver +110 -0
- data/bin/import.rb +78 -0
- data/lib/cortex_reaver.rb +114 -0
- data/lib/cortex_reaver/config.rb +21 -0
- data/lib/cortex_reaver/controller/comment.rb +113 -0
- data/lib/cortex_reaver/controller/config.rb +14 -0
- data/lib/cortex_reaver/controller/journal.rb +40 -0
- data/lib/cortex_reaver/controller/main.rb +56 -0
- data/lib/cortex_reaver/controller/page.rb +34 -0
- data/lib/cortex_reaver/controller/photograph.rb +45 -0
- data/lib/cortex_reaver/controller/project.rb +40 -0
- data/lib/cortex_reaver/controller/tag.rb +67 -0
- data/lib/cortex_reaver/controller/user.rb +71 -0
- data/lib/cortex_reaver/helper/activity.rb +9 -0
- data/lib/cortex_reaver/helper/attachments.rb +139 -0
- data/lib/cortex_reaver/helper/auth.rb +45 -0
- data/lib/cortex_reaver/helper/canonical.rb +55 -0
- data/lib/cortex_reaver/helper/crud.rb +317 -0
- data/lib/cortex_reaver/helper/date.rb +29 -0
- data/lib/cortex_reaver/helper/error.rb +14 -0
- data/lib/cortex_reaver/helper/feeds.rb +88 -0
- data/lib/cortex_reaver/helper/form.rb +114 -0
- data/lib/cortex_reaver/helper/navigation.rb +142 -0
- data/lib/cortex_reaver/helper/photographs.rb +25 -0
- data/lib/cortex_reaver/helper/tags.rb +47 -0
- data/lib/cortex_reaver/helper/workflow.rb +27 -0
- data/lib/cortex_reaver/migrations/001_users.rb +24 -0
- data/lib/cortex_reaver/migrations/002_pages.rb +29 -0
- data/lib/cortex_reaver/migrations/003_journals.rb +26 -0
- data/lib/cortex_reaver/migrations/004_photographs.rb +24 -0
- data/lib/cortex_reaver/migrations/005_projects.rb +27 -0
- data/lib/cortex_reaver/migrations/006_tags.rb +64 -0
- data/lib/cortex_reaver/migrations/007_comments.rb +40 -0
- data/lib/cortex_reaver/migrations/008_config.rb +23 -0
- data/lib/cortex_reaver/model/comment.rb +109 -0
- data/lib/cortex_reaver/model/journal.rb +53 -0
- data/lib/cortex_reaver/model/page.rb +87 -0
- data/lib/cortex_reaver/model/photograph.rb +133 -0
- data/lib/cortex_reaver/model/project.rb +49 -0
- data/lib/cortex_reaver/model/tag.rb +72 -0
- data/lib/cortex_reaver/model/user.rb +147 -0
- data/lib/cortex_reaver/public/css/admin.css +45 -0
- data/lib/cortex_reaver/public/css/custom.css +0 -0
- data/lib/cortex_reaver/public/css/form.css +51 -0
- data/lib/cortex_reaver/public/css/main.css +325 -0
- data/lib/cortex_reaver/public/css/photo.css +113 -0
- data/lib/cortex_reaver/public/css/ramaze_error.css +90 -0
- data/lib/cortex_reaver/public/css/text.css +25 -0
- data/lib/cortex_reaver/public/dispatch.fcgi +11 -0
- data/lib/cortex_reaver/public/images/CortexReaver.gif +0 -0
- data/lib/cortex_reaver/public/images/atom-xml-icon.png +0 -0
- data/lib/cortex_reaver/public/images/body.png +0 -0
- data/lib/cortex_reaver/public/images/border_bottom.png +0 -0
- data/lib/cortex_reaver/public/images/border_bottom_left.png +0 -0
- data/lib/cortex_reaver/public/images/border_bottom_right.png +0 -0
- data/lib/cortex_reaver/public/images/border_left.png +0 -0
- data/lib/cortex_reaver/public/images/border_right.png +0 -0
- data/lib/cortex_reaver/public/images/border_top.png +0 -0
- data/lib/cortex_reaver/public/images/border_top_left.png +0 -0
- data/lib/cortex_reaver/public/images/border_top_right.png +0 -0
- data/lib/cortex_reaver/public/images/comment.gif +0 -0
- data/lib/cortex_reaver/public/images/dark_trans.png +0 -0
- data/lib/cortex_reaver/public/images/delete.gif +0 -0
- data/lib/cortex_reaver/public/images/edit.gif +0 -0
- data/lib/cortex_reaver/public/images/header.png +0 -0
- data/lib/cortex_reaver/public/images/header.xcf +0 -0
- data/lib/cortex_reaver/public/images/header_background.png +0 -0
- data/lib/cortex_reaver/public/images/parent.gif +0 -0
- data/lib/cortex_reaver/public/images/rss-xml-icon.png +0 -0
- data/lib/cortex_reaver/public/images/sections.png +0 -0
- data/lib/cortex_reaver/public/images/sections_highlight.png +0 -0
- data/lib/cortex_reaver/public/js/admin.js +36 -0
- data/lib/cortex_reaver/public/js/cookie.js +27 -0
- data/lib/cortex_reaver/public/js/jquery.js +32 -0
- data/lib/cortex_reaver/public/js/photo.js +33 -0
- data/lib/cortex_reaver/snippets/array.rb +7 -0
- data/lib/cortex_reaver/snippets/ramaze/dispatcher/file.rb +37 -0
- data/lib/cortex_reaver/support/attachments.rb +235 -0
- data/lib/cortex_reaver/support/cached_rendering.rb +79 -0
- data/lib/cortex_reaver/support/canonical.rb +107 -0
- data/lib/cortex_reaver/support/comments.rb +69 -0
- data/lib/cortex_reaver/support/pagination.rb +38 -0
- data/lib/cortex_reaver/support/renderer.rb +196 -0
- data/lib/cortex_reaver/support/sequenceable.rb +248 -0
- data/lib/cortex_reaver/support/tags.rb +108 -0
- data/lib/cortex_reaver/support/timestamps.rb +33 -0
- data/lib/cortex_reaver/version.rb +8 -0
- data/lib/cortex_reaver/view/adminbox.rhtml +56 -0
- data/lib/cortex_reaver/view/blank_layout.rhtml +46 -0
- data/lib/cortex_reaver/view/comments/comment.rhtml +34 -0
- data/lib/cortex_reaver/view/comments/form.rhtml +25 -0
- data/lib/cortex_reaver/view/comments/list.rhtml +5 -0
- data/lib/cortex_reaver/view/comments/post_form.rhtml +36 -0
- data/lib/cortex_reaver/view/config/form.rhtml +10 -0
- data/lib/cortex_reaver/view/error.rhtml +72 -0
- data/lib/cortex_reaver/view/journals/form.rhtml +12 -0
- data/lib/cortex_reaver/view/journals/journal.rhtml +39 -0
- data/lib/cortex_reaver/view/journals/list.rhtml +33 -0
- data/lib/cortex_reaver/view/journals/short.rhtml +3 -0
- data/lib/cortex_reaver/view/journals/show.rhtml +5 -0
- data/lib/cortex_reaver/view/pages/form.rhtml +12 -0
- data/lib/cortex_reaver/view/pages/list.rhtml +26 -0
- data/lib/cortex_reaver/view/pages/show.rhtml +12 -0
- data/lib/cortex_reaver/view/photographs/atom_fragment.rhtml +82 -0
- data/lib/cortex_reaver/view/photographs/form.rhtml +19 -0
- data/lib/cortex_reaver/view/photographs/grid.rhtml +36 -0
- data/lib/cortex_reaver/view/photographs/list.rhtml +9 -0
- data/lib/cortex_reaver/view/photographs/short.rhtml +3 -0
- data/lib/cortex_reaver/view/photographs/show.rhtml +114 -0
- data/lib/cortex_reaver/view/photographs/sidebar.rhtml +7 -0
- data/lib/cortex_reaver/view/projects/form.rhtml +13 -0
- data/lib/cortex_reaver/view/projects/list.rhtml +27 -0
- data/lib/cortex_reaver/view/projects/show.rhtml +38 -0
- data/lib/cortex_reaver/view/tags/form.rhtml +9 -0
- data/lib/cortex_reaver/view/tags/list.rhtml +28 -0
- data/lib/cortex_reaver/view/tags/show.rhtml +51 -0
- data/lib/cortex_reaver/view/text_layout.rhtml +78 -0
- data/lib/cortex_reaver/view/users/form.rhtml +16 -0
- data/lib/cortex_reaver/view/users/list.rhtml +38 -0
- data/lib/cortex_reaver/view/users/login.rhtml +13 -0
- data/lib/cortex_reaver/view/users/register.rhtml +13 -0
- data/lib/cortex_reaver/view/users/show.rhtml +37 -0
- data/lib/cortex_reaver/view/users/user.rhtml +35 -0
- data/lib/proto/cortex_reaver.yaml +28 -0
- metadata +285 -0
data/LICENSE
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
Copyright (c) 2008 Aphyr <aphyr@aphyr.com>
|
2
|
+
All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without
|
5
|
+
modification, are permitted provided that the following conditions are met:
|
6
|
+
|
7
|
+
* Redistributions of source code must retain the above copyright notice,
|
8
|
+
this list of conditions and the following disclaimer.
|
9
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
10
|
+
this list of conditions and the following disclaimer in the documentation
|
11
|
+
and/or other materials provided with the distribution.
|
12
|
+
* Neither the name of this project nor the names of its contributors may be
|
13
|
+
used to endorse or promote products derived from this software without
|
14
|
+
specific prior written permission.
|
15
|
+
|
16
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
17
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
18
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
19
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
20
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
21
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
22
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
23
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
24
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
25
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
CORTEX REAVER - A dangerous Ruby blog engine, with a photographic memory.
|
2
|
+
|
3
|
+
Cortex Reaver is a blog engine for textual journals, photographs, and projects;
|
4
|
+
written using Ramaze and Sequel. Supports tags, comments, and simple
|
5
|
+
attachments. Features canonically named URLs (/journals/show/a-post-title) with
|
6
|
+
conflict resolution, useful formatting modules for content (HTML sanitizing,
|
7
|
+
attachment references, BlueCloth, etc), and custom pages.
|
8
|
+
|
9
|
+
GETTING STARTED
|
10
|
+
|
11
|
+
Dependencies
|
12
|
+
|
13
|
+
First, you'll need a database. For MySQL:
|
14
|
+
|
15
|
+
create database cortex_reaver;
|
16
|
+
grant all privileges on cortex_reaver.* to 'cortex_reaver'@'localhost'
|
17
|
+
identified by 'some-password' with grant option;
|
18
|
+
|
19
|
+
You'll need a YAML configuration file to define Cortex Reaver's configuration.
|
20
|
+
See proto/cortex_reaver.yaml. If no config file is specified on the command
|
21
|
+
line, Cortex Reaver assumes you mean cortex_reaver.yaml in the working
|
22
|
+
directory. Copy lib/proto/cortex_reaver.yaml to a fresh directory, and run
|
23
|
+
|
24
|
+
bin/cortex_reaver -m -c path/to/cortex_reaver.yaml
|
25
|
+
|
26
|
+
To wipe the database and set up a fresh schema. Then run
|
27
|
+
|
28
|
+
bin/cortex_reaver -s -c path/to/cortex_reaver.yaml
|
29
|
+
|
30
|
+
To start the server. Cortex Reaver runs on port 7000 by default, and uses the
|
31
|
+
Mongrel adapter; you can change both of those in your configuration file.
|
32
|
+
|
33
|
+
When you visit your new site, hit control-x (or visit /users/login) to bring up
|
34
|
+
a login prompt. The default username and password are both 'shodan'. Then start
|
35
|
+
posting journals, photographs, projects, and pages!
|
36
|
+
|
37
|
+
Presumably you'll want to start changing images, stylesheets, etc. around. Just
|
38
|
+
create a directory called 'public' and specify its path in your config file.
|
39
|
+
Anything in that directory overrides Cortex Reaver's default public files.
|
40
|
+
|
41
|
+
CREDITS
|
42
|
+
|
43
|
+
I am indebted to the good folks of #sequel and #ramaze for their many
|
44
|
+
suggestions in writing Cortex Reaver, and also to Ryan Grove
|
45
|
+
(http://wonko.com), the author of the excellent (and very similar) blog system
|
46
|
+
Thoth, for invaluable advice and code. Cortex Reaver should have been a fork
|
47
|
+
of Thoth, but my schema is just too complex for the changes to be maintainable
|
48
|
+
going forward.
|
data/bin/console
ADDED
data/bin/cortex_reaver
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'optparse'
|
5
|
+
require 'ramaze'
|
6
|
+
require __DIR__ + '/../lib/cortex_reaver'
|
7
|
+
|
8
|
+
module CortexReaver
|
9
|
+
# Asks a question and returns a true_false answer
|
10
|
+
def self.confirm(question)
|
11
|
+
return true if @values[:force]
|
12
|
+
|
13
|
+
puts question + " (yes/no)"
|
14
|
+
print '> '
|
15
|
+
STDOUT.flush
|
16
|
+
|
17
|
+
if STDIN.gets.strip =~ /^y(?:es)?/i
|
18
|
+
true
|
19
|
+
else
|
20
|
+
false
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Parse options
|
25
|
+
@values = {}
|
26
|
+
parser = OptionParser.new do |o|
|
27
|
+
o.on '-c', '--config file', 'Configuration file' do |file|
|
28
|
+
@values[:config_file] = file
|
29
|
+
end
|
30
|
+
|
31
|
+
o.on '-f', '--force', 'Just do it' do
|
32
|
+
@values[:force] = true
|
33
|
+
end
|
34
|
+
|
35
|
+
o.on '-h', '--help', 'Show help' do
|
36
|
+
@action = :help
|
37
|
+
end
|
38
|
+
|
39
|
+
o.on '-s', '--start',
|
40
|
+
'Start the CortexReaver server.' do
|
41
|
+
@action = :start
|
42
|
+
end
|
43
|
+
|
44
|
+
o.on '-m', '--migrate [version]',
|
45
|
+
'Migrate the database to schema version, or to the latest version.' do |version|
|
46
|
+
@action = :migrate
|
47
|
+
@values[:schema_version] = version ? version.to_i : nil
|
48
|
+
end
|
49
|
+
|
50
|
+
o.on '-r', '--reset',
|
51
|
+
'Wipes the database and sets up a clean copy of the latest version.' do
|
52
|
+
@action = :reset
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
parser.parse! ARGV
|
57
|
+
|
58
|
+
# Main
|
59
|
+
case @action
|
60
|
+
when :migrate
|
61
|
+
version = @values[:schema_version]
|
62
|
+
|
63
|
+
self.config_file = @values[:config_file]
|
64
|
+
self.reload_config
|
65
|
+
self.setup_db
|
66
|
+
|
67
|
+
puts "Using database #{config[:database][:host]}/#{config[:database][:database]}."
|
68
|
+
|
69
|
+
current_version = Sequel::Migrator.get_current_migration_version(db)
|
70
|
+
latest_version = Sequel::Migrator.latest_migration_version(LIB_DIR/:migrations)
|
71
|
+
|
72
|
+
if version == current_version and current_version == latest_version
|
73
|
+
puts "The database is already at the latest version (#{latest_version})."
|
74
|
+
exit
|
75
|
+
elsif version == current_version
|
76
|
+
puts "The database is already at version #{version}."
|
77
|
+
exit
|
78
|
+
end
|
79
|
+
|
80
|
+
if version == 0
|
81
|
+
message = "You are migrating to version 0. This will drop your cortex_reaver database! Are you sure you want to do this?"
|
82
|
+
elsif version
|
83
|
+
message = "Ready to migrate from version #{current_version} to version #{version}?"
|
84
|
+
else
|
85
|
+
message = "Ready to migrate from version #{current_version} to latest version (#{latest_version})?"
|
86
|
+
end
|
87
|
+
|
88
|
+
if confirm message
|
89
|
+
puts "Migrating database from version #{current_version} to version #{version}..."
|
90
|
+
Sequel::Migrator.apply(db, LIB_DIR/:migrations, version)
|
91
|
+
puts "Done."
|
92
|
+
else
|
93
|
+
exit
|
94
|
+
end
|
95
|
+
|
96
|
+
when :reset
|
97
|
+
if confirm "Are you sure you wish to wipe the database?"
|
98
|
+
# Strangely, calling Migrator.apply to go down and then up doesn't seem to work. :-/
|
99
|
+
system($0, '-f', '-m', '0')
|
100
|
+
system($0, '-f', '-m')
|
101
|
+
end
|
102
|
+
|
103
|
+
when :start
|
104
|
+
self.config_file = @values[:config_file]
|
105
|
+
start
|
106
|
+
|
107
|
+
else
|
108
|
+
abort("Unknown action: #{@action}")
|
109
|
+
end
|
110
|
+
end
|
data/bin/import.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
puts `#{File.dirname(__FILE__)}/cortex_reaver -rf #{ARGV.first}`
|
4
|
+
|
5
|
+
require File.dirname(__FILE__) + '/../lib/cortex_reaver'
|
6
|
+
|
7
|
+
CortexReaver.setup ARGV.first
|
8
|
+
|
9
|
+
c = Sequel.connect('mysql://cortex_reaver:RyReajOuc7@localhost/cortex_reaver')
|
10
|
+
f = Sequel.connect('mysql://cortex_reaver:RyReajOuc7@localhost/fiachran')
|
11
|
+
|
12
|
+
# Journals
|
13
|
+
puts "Journals..."
|
14
|
+
f[:journals].each do |journal|
|
15
|
+
journal[:user_id] = journal.delete :author_id
|
16
|
+
journal[:name] = Journal.canonicalize journal[:title]
|
17
|
+
c[:journals] << journal
|
18
|
+
end
|
19
|
+
|
20
|
+
# Projects
|
21
|
+
puts "Projects..."
|
22
|
+
f[:projects].each do |project|
|
23
|
+
project[:user_id] = project.delete :author_id
|
24
|
+
project[:name] = Project.canonicalize project[:title]
|
25
|
+
c[:projects] << project
|
26
|
+
end
|
27
|
+
|
28
|
+
# Photos
|
29
|
+
puts "Photographs..."
|
30
|
+
f[:photographs].each do |photograph|
|
31
|
+
photograph[:user_id] = photograph.delete :author_id
|
32
|
+
photograph[:name] = Photograph.canonicalize photograph[:title]
|
33
|
+
c[:photographs] << photograph
|
34
|
+
end
|
35
|
+
|
36
|
+
# Comments
|
37
|
+
puts "Comments..."
|
38
|
+
f[:comments].each do |comment|
|
39
|
+
if comment[:email] == 'aphyr@aphyr.com'
|
40
|
+
comment[:user_id] = 1
|
41
|
+
end
|
42
|
+
comment[:name] = comment.delete :author
|
43
|
+
c[:comments] << comment
|
44
|
+
end
|
45
|
+
|
46
|
+
# Tags
|
47
|
+
puts "Tags..."
|
48
|
+
f[:tags].each do |tag|
|
49
|
+
tag[:title] = tag[:name]
|
50
|
+
tag[:name] = Tag.canonicalize tag[:name]
|
51
|
+
c[:tags] << tag
|
52
|
+
end
|
53
|
+
|
54
|
+
[:journals_tags, :projects_tags, :photographs_tags].each do |t|
|
55
|
+
f[t].each do |r|
|
56
|
+
c[t] << r
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
puts "Fixing blank comment titles"
|
62
|
+
Comment.infer_blank_titles
|
63
|
+
|
64
|
+
puts "Fixing tag counts"
|
65
|
+
Tag.filter({:name => ''} | {:title => ''}).all.each do |tag|
|
66
|
+
tag.delete
|
67
|
+
end
|
68
|
+
Tag.refresh_counts
|
69
|
+
|
70
|
+
puts "Refreshing comment counts..."
|
71
|
+
Journal.refresh_comment_counts
|
72
|
+
Photograph.refresh_comment_counts
|
73
|
+
Project.refresh_comment_counts
|
74
|
+
|
75
|
+
puts "Refreshing cached render fields..."
|
76
|
+
Journal.refresh_render_caches
|
77
|
+
Project.refresh_render_caches
|
78
|
+
Comment.refresh_render_caches
|
@@ -0,0 +1,114 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'rubygems'
|
5
|
+
require 'ramaze'
|
6
|
+
require 'sequel'
|
7
|
+
require 'yaml'
|
8
|
+
rescue LoadError => e
|
9
|
+
puts e
|
10
|
+
puts "You probably need to install some packages Cortex Reaver needs. Try:
|
11
|
+
apt-get install librmagick-ruby libmysql-ruby;
|
12
|
+
gem install mongrel ramaze sequel yaml erubis BlueCloth rmagick exifr hpricot builder syntax;"
|
13
|
+
exit 255
|
14
|
+
end
|
15
|
+
|
16
|
+
module CortexReaver
|
17
|
+
ROOT = File.expand_path(__DIR__/'..')
|
18
|
+
LIB_DIR = ROOT/:lib/:cortex_reaver
|
19
|
+
|
20
|
+
# We need the configuration class before everything.
|
21
|
+
require LIB_DIR/:config
|
22
|
+
|
23
|
+
# Returns the site configuration
|
24
|
+
def self.config
|
25
|
+
@config
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.config_file
|
29
|
+
@config_file || File.join(Dir.pwd, 'cortex_reaver.yaml')
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.config_file=(file)
|
33
|
+
@config_file = file
|
34
|
+
end
|
35
|
+
|
36
|
+
# Sets the configuration file and reloads
|
37
|
+
def self.configure(file = nil)
|
38
|
+
if file
|
39
|
+
self.config_file = file
|
40
|
+
end
|
41
|
+
reload_config
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.db
|
45
|
+
@db
|
46
|
+
end
|
47
|
+
|
48
|
+
# Load libraries
|
49
|
+
def self.load
|
50
|
+
# Prepare Ramaze
|
51
|
+
Ramaze::Global.public_root = LIB_DIR/:public
|
52
|
+
Ramaze::Global.view_root = config[:view_root]
|
53
|
+
|
54
|
+
# Load controllers and models
|
55
|
+
acquire LIB_DIR/:snippets/'**'/'*'
|
56
|
+
acquire LIB_DIR/:support/'*'
|
57
|
+
acquire LIB_DIR/:model/'*'
|
58
|
+
acquire LIB_DIR/:helper/'*'
|
59
|
+
acquire LIB_DIR/:controller/'*'
|
60
|
+
acquire LIB_DIR/'**'/'*'
|
61
|
+
end
|
62
|
+
|
63
|
+
# Reloads the site configuration
|
64
|
+
def self.reload_config
|
65
|
+
@config = CortexReaver::Config.new(config_file)
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.start
|
69
|
+
# Load configuration
|
70
|
+
reload_config
|
71
|
+
|
72
|
+
# Connect to db
|
73
|
+
setup_db
|
74
|
+
|
75
|
+
# Load library
|
76
|
+
self.load
|
77
|
+
|
78
|
+
# Go!
|
79
|
+
Ramaze.start :adapter => config[:adapter], :port => config[:port]
|
80
|
+
end
|
81
|
+
|
82
|
+
# Load CortexReaver environment; do everything except start Ramaze
|
83
|
+
def self.setup(file)
|
84
|
+
# Load config
|
85
|
+
@config_file = file
|
86
|
+
reload_config
|
87
|
+
|
88
|
+
# Connect to DB
|
89
|
+
setup_db
|
90
|
+
|
91
|
+
# Load library
|
92
|
+
self.load
|
93
|
+
end
|
94
|
+
|
95
|
+
# Connect to DB
|
96
|
+
def self.setup_db
|
97
|
+
unless config
|
98
|
+
raise RuntimeError.new("no configuration available!")
|
99
|
+
end
|
100
|
+
|
101
|
+
unless (string = config[:database]).is_a? String
|
102
|
+
d = config[:database]
|
103
|
+
string = "#{d[:driver]}://#{d[:user]}:#{d[:password]}@#{d[:host]}/#{d[:database]}"
|
104
|
+
end
|
105
|
+
|
106
|
+
@db = Sequel.connect(string)
|
107
|
+
end
|
108
|
+
|
109
|
+
# Disconnect from DB
|
110
|
+
def self.shutdown_db
|
111
|
+
@db.disconnect
|
112
|
+
@db = nil
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module CortexReaver
|
2
|
+
# Contains site-specific configuration information for a CortexReaver site.
|
3
|
+
class Config < Hash
|
4
|
+
# Pass a YAML file with configuration options. At a minimum, it should specify
|
5
|
+
# database = {:proto, :username, :pasword, :host, :database}
|
6
|
+
# or database = "sequel_connect_string"
|
7
|
+
def initialize(file)
|
8
|
+
# Defaults
|
9
|
+
self[:public_root] = File.join(CortexReaver::LIB_DIR, 'public')
|
10
|
+
self[:view_root] = File.join(CortexReaver::LIB_DIR, 'view')
|
11
|
+
self[:adapter] = 'mongrel'
|
12
|
+
self[:port] = 7000
|
13
|
+
|
14
|
+
begin
|
15
|
+
self.merge!(YAML.load(File.read(file)))
|
16
|
+
rescue => e
|
17
|
+
raise RuntimeError.new("unable to load local configuration file #{file}: (#{e.message})")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
module CortexReaver
|
2
|
+
class CommentController < Ramaze::Controller
|
3
|
+
MODEL = Comment
|
4
|
+
|
5
|
+
map '/comments'
|
6
|
+
layout '/text_layout'
|
7
|
+
template :edit, :form
|
8
|
+
template :new, :form
|
9
|
+
engine :Erubis
|
10
|
+
|
11
|
+
helper :error,
|
12
|
+
:auth,
|
13
|
+
:form,
|
14
|
+
:workflow,
|
15
|
+
:navigation,
|
16
|
+
:date,
|
17
|
+
:canonical,
|
18
|
+
:crud,
|
19
|
+
:feeds
|
20
|
+
|
21
|
+
on_save do |comment, request|
|
22
|
+
comment.title = request[:title]
|
23
|
+
comment.body = request[:body]
|
24
|
+
comment.comment_id = request[:comment_id]
|
25
|
+
comment.journal_id = request[:journal_id]
|
26
|
+
comment.photograph_id = request[:photograph_id]
|
27
|
+
comment.project_id = request[:project_id]
|
28
|
+
end
|
29
|
+
|
30
|
+
on_create do |comment, request|
|
31
|
+
# User-specific properties
|
32
|
+
if session[:user]
|
33
|
+
# A user is logged in.
|
34
|
+
comment.user = session[:user]
|
35
|
+
else
|
36
|
+
# Save the anonymous comment.
|
37
|
+
comment.name = request[:name].blank? ? nil : request[:name]
|
38
|
+
comment.email = request[:email].blank? ? nil : request[:email]
|
39
|
+
comment.http = request[:http].blank? ? nil : request[:http]
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
for_feed do |comment, x|
|
44
|
+
x.content comment.body_cache, :type => 'html'
|
45
|
+
end
|
46
|
+
|
47
|
+
# We only really care about tracking recent comments.
|
48
|
+
def page(page)
|
49
|
+
@title = "Recent Comments"
|
50
|
+
@comments = Comment.order(:created_on).reverse.limit(16)
|
51
|
+
|
52
|
+
render_template :list
|
53
|
+
end
|
54
|
+
|
55
|
+
def post
|
56
|
+
unless request.post?
|
57
|
+
flash[:error] = "No comment to post!"
|
58
|
+
redirect_to R(:/)
|
59
|
+
end
|
60
|
+
|
61
|
+
begin
|
62
|
+
# Create comment
|
63
|
+
CortexReaver.db.transaction do
|
64
|
+
@comment = Comment.new
|
65
|
+
|
66
|
+
@comment.title = request[:title]
|
67
|
+
@comment.body = request[:body]
|
68
|
+
@comment.comment_id = request[:comment_id]
|
69
|
+
@comment.journal_id = request[:journal_id]
|
70
|
+
@comment.photograph_id = request[:photograph_id]
|
71
|
+
@comment.project_id = request[:project_id]
|
72
|
+
|
73
|
+
if session[:user]
|
74
|
+
# A user is logged in. Use their account.
|
75
|
+
@comment.user = session[:user]
|
76
|
+
else
|
77
|
+
# Use anonymous info, if it won't conflict.
|
78
|
+
if User.filter(:email => request[:email]).count > 0
|
79
|
+
# Conflicts!
|
80
|
+
flash[:error] = "Sorry, that email address belongs to a registered user. Would you like to <a href=\"/user/login\">log in</a>? Your comment will still be here when you get back."
|
81
|
+
|
82
|
+
# Save comment and go back to the parent.
|
83
|
+
session[:pending_comment] = @comment
|
84
|
+
redirect comment.parent.url
|
85
|
+
else
|
86
|
+
# Okay, set anonymous info
|
87
|
+
@comment.name = request[:name] unless request[:name].blank?
|
88
|
+
@comment.email = request[:email] unless request[:email].blank?
|
89
|
+
@comment.http = request[:http] unless request[:http].blank?
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# Save
|
94
|
+
raise unless @comment.save
|
95
|
+
|
96
|
+
flash[:notice] = "Your comment (<a href=\"##{@comment.url.gsub(/.*#/, '')}\">#{h @comment.title}</a>) has been posted."
|
97
|
+
redirect @comment.parent.url
|
98
|
+
end
|
99
|
+
rescue => e
|
100
|
+
# An error occurred
|
101
|
+
Ramaze::Log.error e.inspect + e.backtrace.join("\n")
|
102
|
+
flash[:error] = "We couldn't post your comment."
|
103
|
+
|
104
|
+
if @comment.parent
|
105
|
+
session[:pending_comment] = @comment
|
106
|
+
redirect @comment.parent.url + '#post-comment'
|
107
|
+
else
|
108
|
+
redirect R(:/)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|