georgia 0.7.1 → 0.7.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +28 -9
- data/app/controllers/georgia/messages_controller.rb +2 -10
- data/app/controllers/georgia/pages_controller.rb +2 -15
- data/app/models/ckeditor/asset.rb +1 -17
- data/app/models/georgia/message.rb +2 -19
- data/app/models/georgia/page.rb +1 -1
- data/app/views/georgia/pages/_page.html.erb +2 -2
- data/config/initializers/acts_as_taggable_on.rb +5 -3
- data/lib/generators/georgia/install/install_generator.rb +1 -16
- data/lib/generators/georgia/install/templates/README +1 -3
- data/lib/generators/georgia/install/templates/config/initializers/georgia.rb +5 -1
- data/lib/georgia/engine.rb +0 -1
- data/lib/georgia/indexer/adapter.rb +10 -0
- data/lib/georgia/indexer/solr/ckeditor/asset.rb +30 -0
- data/lib/georgia/indexer/solr/georgia/message.rb +31 -0
- data/lib/georgia/indexer/solr/georgia/page.rb +71 -0
- data/lib/georgia/indexer/solr_adapter.rb +8 -0
- data/lib/georgia/indexer/tire/ckeditor/asset.rb +29 -0
- data/lib/georgia/indexer/tire/georgia/message.rb +41 -0
- data/lib/georgia/indexer/tire/georgia/page.rb +54 -0
- data/lib/georgia/indexer/tire_adapter.rb +20 -0
- data/lib/georgia/indexer.rb +26 -0
- data/lib/georgia/version.rb +1 -1
- data/lib/georgia.rb +14 -2
- data/lib/tasks/georgia.rake +8 -40
- metadata +12 -24
- data/app/decorators/sunspot/highlighted_hit_decorator.rb +0 -29
- data/app/models/georgia/concerns/indexable.rb +0 -67
- data/lib/generators/georgia/upgrade/templates/add_anti_spam_to_messages.rb +0 -12
- data/lib/generators/georgia/upgrade/templates/add_contents_counter_cache_to_images.rb +0 -15
- data/lib/generators/georgia/upgrade/templates/add_public_to_georgia_pages.rb +0 -8
- data/lib/generators/georgia/upgrade/templates/add_state_to_georgia_pages.rb +0 -13
- data/lib/generators/georgia/upgrade/templates/create_georgia_revisions.rb +0 -12
- data/lib/generators/georgia/upgrade/upgrade_generator.rb +0 -34
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aca6c1088ccbab0f52eff3ed79cd151ca4820787
|
4
|
+
data.tar.gz: 5276e31dc6309e9f8f26d604bf5e37b7e825b3f7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e9bdc07d844634e0a21b5130e7ae416dbb2c0fa9461267fa8f7b33b3ec8dd9afbf5cd1c7cd9068b66da56a343ab03cd82f4dbbc1c9b34fce9c270fab0ddd39f
|
7
|
+
data.tar.gz: 67f8b0f80832d20262f96b25312eb5329baf56de508b02016f4846208ea336575114d6e69f19e2b045f12855da8c4f1975882611b0a211eb7b85faa993369496
|
data/README.md
CHANGED
@@ -1,24 +1,43 @@
|
|
1
|
-
|
1
|
+
## Georgia
|
2
2
|
|
3
3
|
This project rocks and uses MIT-LICENSE.
|
4
4
|
|
5
|
-
|
5
|
+
### Getting started
|
6
6
|
|
7
7
|
Make sure you have properly identify your default locale and possible available ones.
|
8
8
|
Georgia uses available_locales to know which translations should be configured or not.
|
9
9
|
|
10
|
-
|
11
|
-
|
10
|
+
config.i18n.default_locale = :en
|
11
|
+
config.i18n.available_locales = [:en]
|
12
12
|
|
13
13
|
Then run the generator to mount routes, run migrations & setup initial instances.
|
14
14
|
|
15
15
|
rails g georgia:install
|
16
16
|
|
17
|
-
Start your server (`rails server`) and go to
|
17
|
+
Start your server (`rails server`) and go to [http://localhost:3000/admin](http://localhost:3000/admin) to get started.
|
18
18
|
|
19
|
-
|
19
|
+
#### Heroku
|
20
20
|
|
21
|
-
|
21
|
+
You will need certain addons to make it work. I suggest going with this list matching Georgia's default tools:
|
22
22
|
|
23
|
-
|
24
|
-
|
23
|
+
heroku addons:add bonsai
|
24
|
+
heroku addons:add sendgrid
|
25
|
+
|
26
|
+
Add `config/initializers/bonsai.rb` with:
|
27
|
+
|
28
|
+
ENV['ELASTICSEARCH_URL'] = ENV['BONSAI_URL']
|
29
|
+
|
30
|
+
Finally, create your indices with these commands:
|
31
|
+
|
32
|
+
heroku run rake environment tire:import CLASS=Georgia::Page FORCE=true
|
33
|
+
heroku run rake environment tire:import CLASS=Georgia::Message FORCE=true
|
34
|
+
heroku run rake environment tire:import CLASS=Ckeditor::Asset FORCE=true
|
35
|
+
|
36
|
+
For more information, you can also follow these [instructions](https://gist.github.com/nz/2041121) to setup bonsai.io. More [here](https://devcenter.heroku.com/articles/bonsai) on heroku.com
|
37
|
+
|
38
|
+
### Testing
|
39
|
+
|
40
|
+
#### Run rspec
|
41
|
+
|
42
|
+
cd spec/dummy
|
43
|
+
rspec spec
|
@@ -58,16 +58,8 @@ module Georgia
|
|
58
58
|
private
|
59
59
|
|
60
60
|
def prepare_search
|
61
|
-
@
|
62
|
-
|
63
|
-
fields(:name, :email, :message, :subject, :phone)
|
64
|
-
end
|
65
|
-
facet :spam
|
66
|
-
with(:spam, (params[:s] || 'clean'))
|
67
|
-
order_by (params[:o] || :created_at), (params[:dir] || :desc)
|
68
|
-
paginate(page: params[:page], per_page: (params[:per] || 25))
|
69
|
-
end
|
70
|
-
@messages = Georgia::MessageDecorator.decorate_collection(@search.results)
|
61
|
+
@results = Georgia::Indexer.adapter.search(Georgia::Message, params)
|
62
|
+
@messages = Georgia::MessageDecorator.decorate_collection(@results)
|
71
63
|
end
|
72
64
|
|
73
65
|
end
|
@@ -149,21 +149,8 @@ module Georgia
|
|
149
149
|
|
150
150
|
def search
|
151
151
|
session[:search_params] = params
|
152
|
-
@
|
153
|
-
|
154
|
-
fields(:title, :excerpt, :text, :keywords, :tags, :url, :template)
|
155
|
-
end
|
156
|
-
facet :state, :template, :tag_list
|
157
|
-
# ensure pages indexed in the wrong bucket don't get displayed
|
158
|
-
with(:class_name, model.to_s)
|
159
|
-
with(:state, params[:s]) unless params[:s].blank?
|
160
|
-
with(:template, params[:t]) unless params[:t].blank?
|
161
|
-
with(:tag_list).all_of(params[:tg]) unless params[:tg].blank?
|
162
|
-
order_by (params[:o] || :updated_at), (params[:dir] || :desc)
|
163
|
-
paginate(page: params[:page], per_page: (params[:per] || 25))
|
164
|
-
instance_eval &model.extra_search_params if model.respond_to? :extra_search_params
|
165
|
-
end
|
166
|
-
@pages = Georgia::PageDecorator.decorate_collection(@search.results)
|
152
|
+
@results = Georgia::Indexer.adapter.search(model, params)
|
153
|
+
@pages = Georgia::PageDecorator.decorate_collection(@results)
|
167
154
|
end
|
168
155
|
|
169
156
|
private
|
@@ -5,6 +5,7 @@ class Ckeditor::Asset < ActiveRecord::Base
|
|
5
5
|
|
6
6
|
include Ckeditor::Orm::ActiveRecord::AssetBase
|
7
7
|
include Georgia::Concerns::Taggable
|
8
|
+
include Georgia::Indexer
|
8
9
|
|
9
10
|
delegate :url, :current_path, :content_type, to: :data
|
10
11
|
|
@@ -31,23 +32,6 @@ class Ckeditor::Asset < ActiveRecord::Base
|
|
31
32
|
@extension ||= data_content_type.gsub(/.*\/(.*)/, '\1')
|
32
33
|
end
|
33
34
|
|
34
|
-
searchable do
|
35
|
-
text :filename, stored: true
|
36
|
-
text :tags do
|
37
|
-
tag_list.join(', ')
|
38
|
-
end
|
39
|
-
string :tags, stored: true, multiple: true do
|
40
|
-
tag_list
|
41
|
-
end
|
42
|
-
string :extension, stored: true do
|
43
|
-
extension.try(:downcase)
|
44
|
-
end
|
45
|
-
time :updated_at
|
46
|
-
integer :size, stored: true do
|
47
|
-
size / 1024 # gives size in KB
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
35
|
SIZE_RANGE = {
|
52
36
|
'< 25 KB' => 0..25,
|
53
37
|
'25 KB to 100 KB' => 25..100,
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module Georgia
|
2
2
|
class Message < ActiveRecord::Base
|
3
3
|
|
4
|
+
include Georgia::Indexer
|
5
|
+
|
4
6
|
attr_accessible :name, :email, :subject, :message, :attachment, :phone
|
5
7
|
delegate :url, :current_path, :size, :content_type, :filename, to: :attachment
|
6
8
|
|
@@ -20,25 +22,6 @@ module Georgia
|
|
20
22
|
scope :ham, where(spam: false)
|
21
23
|
scope :latest, order("created_at DESC")
|
22
24
|
|
23
|
-
# Search
|
24
|
-
searchable do
|
25
|
-
text :name
|
26
|
-
text :email
|
27
|
-
text :message
|
28
|
-
text :subject
|
29
|
-
text :phone
|
30
|
-
string :spam do
|
31
|
-
status
|
32
|
-
end
|
33
|
-
# For sorting:
|
34
|
-
string :name
|
35
|
-
string :email
|
36
|
-
string :phone
|
37
|
-
string :subject
|
38
|
-
string :message
|
39
|
-
time :created_at
|
40
|
-
end
|
41
|
-
|
42
25
|
def status
|
43
26
|
@status ||= spam ? 'spam' : 'clean'
|
44
27
|
end
|
data/app/models/georgia/page.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
module Georgia
|
2
2
|
class Page < ActiveRecord::Base
|
3
3
|
|
4
|
+
include Georgia::Indexer
|
4
5
|
include Georgia::Concerns::Taggable
|
5
6
|
include Georgia::Concerns::Orderable
|
6
7
|
include Georgia::Concerns::Slugable
|
7
8
|
include Georgia::Concerns::Revisionable
|
8
9
|
include Georgia::Concerns::Publishable
|
9
|
-
include Georgia::Concerns::Indexable
|
10
10
|
include Georgia::Concerns::Treeable
|
11
11
|
include Georgia::Concerns::Cacheable
|
12
12
|
|
@@ -4,7 +4,7 @@
|
|
4
4
|
</td>
|
5
5
|
<td>
|
6
6
|
<%= icon_tag 'pencil hide pull-right muted' %>
|
7
|
-
<%= link_to page.title,
|
7
|
+
<%= link_to page.title, edit_page_revision_path(page_id: page.id, id: page.revision_id), class: 'page-title js-toggle-icon' %>
|
8
8
|
</td>
|
9
9
|
<td>
|
10
10
|
<%= facet_list_tag(page.tag_list, :tg) %>
|
@@ -14,6 +14,6 @@
|
|
14
14
|
<%= facet_tag(page.template, :t) %>
|
15
15
|
</td>
|
16
16
|
<td class='timestamp'>
|
17
|
-
<em><%= page.updated_at
|
17
|
+
<em><%= page.updated_at %></em>
|
18
18
|
</td>
|
19
19
|
</tr>
|
@@ -12,8 +12,10 @@ ActsAsTaggableOn.remove_unused_tags = true
|
|
12
12
|
# If you would like tags to be case-sensitive and not use LIKE queries for creation:
|
13
13
|
# ActsAsTaggableOn.strict_case_match = true
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
if defined?(Sunspot)
|
16
|
+
ActsAsTaggableOn::Tag.class_eval do
|
17
|
+
searchable do
|
18
|
+
text :name
|
19
|
+
end
|
18
20
|
end
|
19
21
|
end
|
@@ -35,27 +35,12 @@ module Georgia
|
|
35
35
|
|
36
36
|
def create_admin_user
|
37
37
|
say("You're almost done. You need an admin user to get started.", :yellow)
|
38
|
-
|
39
|
-
last_name = ask("Last name:")
|
40
|
-
email = ask("Email:")
|
41
|
-
password = ask("Password:")
|
42
|
-
Georgia::User.create(first_name: first_name, last_name: last_name, email: email, password: password, password_confirmation: password) do |user|
|
43
|
-
user.roles << Georgia::Role.all
|
44
|
-
end
|
38
|
+
rake "georgia:seed"
|
45
39
|
end
|
46
40
|
|
47
41
|
def copy_templates
|
48
42
|
template "config/initializers/georgia.rb"
|
49
43
|
template "app/controllers/pages_controller.rb"
|
50
|
-
template 'Procfile'
|
51
|
-
end
|
52
|
-
|
53
|
-
def add_dev_gems
|
54
|
-
gem_group :development do
|
55
|
-
gem "foreman"
|
56
|
-
gem "sunspot_solr", '2.0.0'
|
57
|
-
end
|
58
|
-
run "bundle"
|
59
44
|
end
|
60
45
|
|
61
46
|
def show_readme
|
@@ -7,8 +7,6 @@ Some setup you must do manually if you haven't yet:
|
|
7
7
|
|
8
8
|
2. Ensure your routes we've just added are in order.
|
9
9
|
|
10
|
-
3.
|
11
|
-
|
12
|
-
bundle exec foreman start
|
10
|
+
3. Ensure you chose one of the 2 indexers currently available (solr or elasticsearch).
|
13
11
|
|
14
12
|
===============================================================================
|
@@ -11,5 +11,9 @@ Georgia.setup do |config|
|
|
11
11
|
|
12
12
|
# Georgia Headers
|
13
13
|
# Add to this list or simply change order
|
14
|
-
# config.
|
14
|
+
# config.navigation = %w(dashboard pages messages media navigation widgets)
|
15
|
+
|
16
|
+
# Indexer
|
17
|
+
# Choices are :solr or :tire
|
18
|
+
# config.indexer = :tire
|
15
19
|
end
|
data/lib/georgia/engine.rb
CHANGED
@@ -0,0 +1,30 @@
|
|
1
|
+
module Georgia
|
2
|
+
module Indexer
|
3
|
+
module Solr
|
4
|
+
module Ckeditor
|
5
|
+
module Asset
|
6
|
+
def self.extended(base)
|
7
|
+
base.class_eval do
|
8
|
+
searchable do
|
9
|
+
text :filename, stored: true
|
10
|
+
text :tags do
|
11
|
+
tag_list.join(', ')
|
12
|
+
end
|
13
|
+
string :tags, stored: true, multiple: true do
|
14
|
+
tag_list
|
15
|
+
end
|
16
|
+
string :extension, stored: true do
|
17
|
+
extension.try(:downcase)
|
18
|
+
end
|
19
|
+
time :updated_at
|
20
|
+
integer :size, stored: true do
|
21
|
+
size / 1024 # gives size in KB
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Georgia
|
2
|
+
module Indexer
|
3
|
+
module Solr
|
4
|
+
module Georgia
|
5
|
+
module Message
|
6
|
+
def self.extended(base)
|
7
|
+
base.class_eval do
|
8
|
+
searchable do
|
9
|
+
text :name
|
10
|
+
text :email
|
11
|
+
text :message
|
12
|
+
text :subject
|
13
|
+
text :phone
|
14
|
+
string :spam do
|
15
|
+
status
|
16
|
+
end
|
17
|
+
# For sorting:
|
18
|
+
string :name
|
19
|
+
string :email
|
20
|
+
string :phone
|
21
|
+
string :subject
|
22
|
+
string :message
|
23
|
+
time :created_at
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Georgia
|
2
|
+
module Indexer
|
3
|
+
module Solr
|
4
|
+
module Georgia
|
5
|
+
module Page
|
6
|
+
def self.extended(base)
|
7
|
+
base.class_eval do
|
8
|
+
searchable do
|
9
|
+
text :title, stored: true do
|
10
|
+
revisions.map{|r| r.contents.map(&:title)}.flatten.uniq.join(', ')
|
11
|
+
end
|
12
|
+
text :excerpt, stored: true do
|
13
|
+
revisions.map{|r| r.contents.map(&:excerpt)}.flatten.uniq.join(', ')
|
14
|
+
end
|
15
|
+
text :text do
|
16
|
+
revisions.map{|r| r.contents.map(&:text)}.flatten.uniq.join(', ')
|
17
|
+
end
|
18
|
+
text :keywords do
|
19
|
+
revisions.map{|r| r.contents.map(&:keyword_list)}.flatten.uniq.join(', ')
|
20
|
+
end
|
21
|
+
text :template do
|
22
|
+
revisions.map(&:template).uniq.join(', ')
|
23
|
+
end
|
24
|
+
text :tags do
|
25
|
+
tag_list.join(', ')
|
26
|
+
end
|
27
|
+
text :url
|
28
|
+
string :class_name do
|
29
|
+
self.class.name
|
30
|
+
end
|
31
|
+
string :title
|
32
|
+
string :excerpt
|
33
|
+
string :text
|
34
|
+
string :url
|
35
|
+
string :template
|
36
|
+
string :state do
|
37
|
+
publish_state
|
38
|
+
end
|
39
|
+
string :keywords, stored: true, multiple: true do
|
40
|
+
revisions.map{|r| r.contents.map(&:keyword_list)}.flatten.uniq
|
41
|
+
end
|
42
|
+
string :tag_list, stored: true, multiple: true #Facets (multiple)
|
43
|
+
string :tags do #Ordering (single list)
|
44
|
+
tag_list.join(', ')
|
45
|
+
end
|
46
|
+
time :updated_at # default for ordering
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.search_index model, params
|
50
|
+
@search = model.search do
|
51
|
+
fulltext params[:query] do
|
52
|
+
fields(:title, :excerpt, :text, :keywords, :tags, :url, :template)
|
53
|
+
end
|
54
|
+
facet :state, :template, :tag_list
|
55
|
+
# ensure pages indexed in the wrong bucket don't get displayed
|
56
|
+
with(:class_name, model.to_s)
|
57
|
+
with(:state, params[:s]) unless params[:s].blank?
|
58
|
+
with(:template, params[:t]) unless params[:t].blank?
|
59
|
+
with(:tag_list).all_of(params[:tg]) unless params[:tg].blank?
|
60
|
+
order_by (params[:o] || :updated_at), (params[:dir] || :desc)
|
61
|
+
paginate(page: params[:page], per_page: (params[:per] || 25))
|
62
|
+
instance_eval &model.extra_search_params if model.respond_to? :extra_search_params
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Georgia
|
2
|
+
module Indexer
|
3
|
+
module Tire
|
4
|
+
module Ckeditor
|
5
|
+
module Asset
|
6
|
+
def self.extended(base)
|
7
|
+
base.class_eval do
|
8
|
+
|
9
|
+
include ::Tire::Model::Search
|
10
|
+
include ::Tire::Model::Callbacks
|
11
|
+
|
12
|
+
mapping do
|
13
|
+
indexes :id, :index => :not_analyzed
|
14
|
+
indexes :filename
|
15
|
+
indexes :tags
|
16
|
+
indexes :extension
|
17
|
+
indexes :updated_at, :type => 'date'
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.search_index model, params
|
21
|
+
model.search(params[:query], page: (params[:page] || 1))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Georgia
|
2
|
+
module Indexer
|
3
|
+
module Tire
|
4
|
+
module Georgia
|
5
|
+
module Message
|
6
|
+
def self.extended(base)
|
7
|
+
base.class_eval do
|
8
|
+
include ::Tire::Model::Search
|
9
|
+
include ::Tire::Model::Callbacks
|
10
|
+
|
11
|
+
def to_indexed_json
|
12
|
+
{
|
13
|
+
name: name,
|
14
|
+
email: email,
|
15
|
+
message: message,
|
16
|
+
subject: subject,
|
17
|
+
phone: phone,
|
18
|
+
spam: spam,
|
19
|
+
updated_at: updated_at.strftime('%F')
|
20
|
+
}.to_json
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.search model, params
|
24
|
+
model.tire.search(page: (params[:page] || 1), per_page: (params[:per] || 25)) do
|
25
|
+
if params[:query].present?
|
26
|
+
query do
|
27
|
+
boolean do
|
28
|
+
must { string params[:query], default_operator: "AND" }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
sort { by (params[:o] || :updated_at), (params[:dir] || :desc) }
|
32
|
+
end
|
33
|
+
end.results
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Georgia
|
2
|
+
module Indexer
|
3
|
+
module Tire
|
4
|
+
module Georgia
|
5
|
+
module Page
|
6
|
+
def self.extended(base)
|
7
|
+
base.class_eval do
|
8
|
+
include ::Tire::Model::Search
|
9
|
+
include ::Tire::Model::Callbacks
|
10
|
+
|
11
|
+
def to_indexed_json
|
12
|
+
title = revisions.map{|r| r.contents.map(&:title)}.flatten.uniq.join(', ')
|
13
|
+
text = revisions.map{|r| r.contents.map(&:text)}.flatten.uniq.join(', ')
|
14
|
+
excerpt = revisions.map{|r| r.contents.map(&:excerpt)}.flatten.uniq.join(', ')
|
15
|
+
keywords = revisions.map{|r| r.contents.map(&:keyword_list)}.flatten.uniq.join(', ')
|
16
|
+
template = revisions.map(&:template).uniq.join(', ')
|
17
|
+
tags = tag_list.join(', ')
|
18
|
+
class_name = self.class.name
|
19
|
+
|
20
|
+
{
|
21
|
+
title: title,
|
22
|
+
text: text,
|
23
|
+
excerpt: excerpt,
|
24
|
+
keywords: keywords,
|
25
|
+
url: url,
|
26
|
+
template: template,
|
27
|
+
tags: tags,
|
28
|
+
tag_list: tag_list,
|
29
|
+
publish_state: publish_state,
|
30
|
+
class_name: class_name,
|
31
|
+
updated_at: updated_at.strftime('%F'),
|
32
|
+
revision_id: revision_id
|
33
|
+
}.to_json
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.search model, params
|
37
|
+
model.tire.search(page: (params[:page] || 1), per_page: (params[:per] || 25)) do
|
38
|
+
if params[:query].present?
|
39
|
+
query do
|
40
|
+
boolean do
|
41
|
+
must { string params[:query], default_operator: "AND" }
|
42
|
+
end
|
43
|
+
end
|
44
|
+
sort { by (params[:o] || :updated_at), (params[:dir] || :desc) }
|
45
|
+
end
|
46
|
+
end.results
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'georgia/indexer/tire/georgia/page'
|
2
|
+
require 'georgia/indexer/tire/georgia/message'
|
3
|
+
require 'georgia/indexer/tire/ckeditor/asset'
|
4
|
+
|
5
|
+
module Georgia::Indexer
|
6
|
+
class TireAdapter < Adapter
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
extend_models
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def extend_models
|
15
|
+
::Georgia::Page.send(:extend, Georgia::Indexer::Tire::Georgia::Page)
|
16
|
+
::Georgia::Message.send(:extend, Georgia::Indexer::Tire::Georgia::Message)
|
17
|
+
::Ckeditor::Asset.send(:extend, Georgia::Indexer::Tire::Ckeditor::Asset)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'georgia/indexer/adapter'
|
2
|
+
|
3
|
+
module Georgia
|
4
|
+
module Indexer
|
5
|
+
autoload :SolrAdapter, 'georgia/indexer/solr_adapter'
|
6
|
+
autoload :TireAdapter, 'georgia/indexer/tire_adapter'
|
7
|
+
|
8
|
+
mattr_accessor :adapter
|
9
|
+
|
10
|
+
def self.included(base)
|
11
|
+
@@adapter ||= adapter_lookup
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def self.adapter_lookup
|
17
|
+
(case Georgia.indexer
|
18
|
+
when :solr then Georgia::Indexer::SolrAdapter.new
|
19
|
+
when :tire then Georgia::Indexer::TireAdapter.new
|
20
|
+
else
|
21
|
+
Georgia::Indexer::TireAdapter.new
|
22
|
+
end)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
data/lib/georgia/version.rb
CHANGED
data/lib/georgia.rb
CHANGED
@@ -2,6 +2,7 @@ require "georgia/version"
|
|
2
2
|
require "georgia/paths"
|
3
3
|
require "georgia/engine"
|
4
4
|
require "georgia/assets"
|
5
|
+
require "georgia/indexer"
|
5
6
|
|
6
7
|
module Georgia
|
7
8
|
|
@@ -14,11 +15,22 @@ module Georgia
|
|
14
15
|
mattr_accessor :url
|
15
16
|
@@url = "http://www.example.com"
|
16
17
|
|
17
|
-
mattr_accessor :
|
18
|
-
@@
|
18
|
+
mattr_accessor :navigation
|
19
|
+
@@navigation = %w(dashboard pages messages media navigation widgets)
|
20
|
+
|
21
|
+
mattr_accessor :indexer
|
22
|
+
@@indexer = :solr
|
19
23
|
|
20
24
|
def self.setup
|
21
25
|
yield self
|
22
26
|
end
|
23
27
|
|
28
|
+
class << self
|
29
|
+
alias :header :navigation
|
30
|
+
|
31
|
+
def header= value
|
32
|
+
ActiveSupport::Deprecation.warn("config.header is deprecated, use config.navigation instead.", caller)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
24
36
|
end
|
data/lib/tasks/georgia.rake
CHANGED
@@ -1,46 +1,14 @@
|
|
1
1
|
namespace :georgia do
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
page.parent = Georgia::Page.find(parent)
|
12
|
-
page.save!
|
13
|
-
rescue ActiveRecord::RecordNotFound
|
14
|
-
puts 'Page not found'
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
20
|
-
|
21
|
-
desc "Saves keywords to tags list"
|
22
|
-
task tags: :environment do
|
23
|
-
|
24
|
-
Georgia::Content.find_each do |content|
|
25
|
-
content.keyword_list = content.keywords
|
26
|
-
content.save
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
desc "Purge assets that don't have an existing file in the cloud"
|
33
|
-
task purge: :environment do
|
34
|
-
count = 0
|
35
|
-
Ckeditor::Asset.find_each do |asset|
|
36
|
-
begin
|
37
|
-
if !asset.data.file.exists?
|
38
|
-
asset.destroy
|
39
|
-
count += 1
|
40
|
-
end
|
41
|
-
end
|
3
|
+
desc "Creates an Admin user to get started"
|
4
|
+
task seed: :environment do
|
5
|
+
first_name = ask("First name:")
|
6
|
+
last_name = ask("Last name:")
|
7
|
+
email = ask("Email:")
|
8
|
+
password = ask("Password:")
|
9
|
+
Georgia::User.create(first_name: first_name, last_name: last_name, email: email, password: password, password_confirmation: password) do |user|
|
10
|
+
user.roles << Georgia::Role.all
|
42
11
|
end
|
43
|
-
puts "#{count} assets purged."
|
44
12
|
end
|
45
13
|
|
46
14
|
namespace :messages do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: georgia
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mathieu Gagné
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -374,20 +374,6 @@ dependencies:
|
|
374
374
|
- - '>='
|
375
375
|
- !ruby/object:Gem::Version
|
376
376
|
version: '0'
|
377
|
-
- !ruby/object:Gem::Dependency
|
378
|
-
name: sunspot_rails
|
379
|
-
requirement: !ruby/object:Gem::Requirement
|
380
|
-
requirements:
|
381
|
-
- - '='
|
382
|
-
- !ruby/object:Gem::Version
|
383
|
-
version: 2.0.0
|
384
|
-
type: :runtime
|
385
|
-
prerelease: false
|
386
|
-
version_requirements: !ruby/object:Gem::Requirement
|
387
|
-
requirements:
|
388
|
-
- - '='
|
389
|
-
- !ruby/object:Gem::Version
|
390
|
-
version: 2.0.0
|
391
377
|
- !ruby/object:Gem::Dependency
|
392
378
|
name: state_machine
|
393
379
|
requirement: !ruby/object:Gem::Requirement
|
@@ -592,7 +578,6 @@ files:
|
|
592
578
|
- app/assets/stylesheets/georgia/vendor/_tooltip.scss
|
593
579
|
- app/assets/stylesheets/georgia/overrides/_select2.scss
|
594
580
|
- app/assets/stylesheets/georgia/application.css.scss
|
595
|
-
- app/decorators/sunspot/highlighted_hit_decorator.rb
|
596
581
|
- app/decorators/pagination_decorator.rb
|
597
582
|
- app/decorators/georgia/link_decorator.rb
|
598
583
|
- app/decorators/georgia/widget_decorator.rb
|
@@ -622,7 +607,6 @@ files:
|
|
622
607
|
- app/models/georgia/concerns/statable.rb
|
623
608
|
- app/models/georgia/concerns/templatable.rb
|
624
609
|
- app/models/georgia/concerns/orderable.rb
|
625
|
-
- app/models/georgia/concerns/indexable.rb
|
626
610
|
- app/models/georgia/concerns/contentable.rb
|
627
611
|
- app/models/georgia/concerns/taggable.rb
|
628
612
|
- app/models/georgia/concerns/treeable.rb
|
@@ -805,12 +789,6 @@ files:
|
|
805
789
|
- lib/tasks/georgia.rake
|
806
790
|
- lib/tasks/upgrade.rake
|
807
791
|
- lib/tasks/assets.rake
|
808
|
-
- lib/generators/georgia/upgrade/templates/add_contents_counter_cache_to_images.rb
|
809
|
-
- lib/generators/georgia/upgrade/templates/create_georgia_revisions.rb
|
810
|
-
- lib/generators/georgia/upgrade/templates/add_state_to_georgia_pages.rb
|
811
|
-
- lib/generators/georgia/upgrade/templates/add_public_to_georgia_pages.rb
|
812
|
-
- lib/generators/georgia/upgrade/templates/add_anti_spam_to_messages.rb
|
813
|
-
- lib/generators/georgia/upgrade/upgrade_generator.rb
|
814
792
|
- lib/generators/georgia/install/templates/Procfile
|
815
793
|
- lib/generators/georgia/install/templates/app/controllers/pages_controller.rb
|
816
794
|
- lib/generators/georgia/install/templates/config/initializers/georgia.rb
|
@@ -823,7 +801,17 @@ files:
|
|
823
801
|
- lib/georgia/engine.rb
|
824
802
|
- lib/georgia/version.rb
|
825
803
|
- lib/georgia/paths.rb
|
804
|
+
- lib/georgia/indexer.rb
|
826
805
|
- lib/georgia/assets.rb
|
806
|
+
- lib/georgia/indexer/tire_adapter.rb
|
807
|
+
- lib/georgia/indexer/solr_adapter.rb
|
808
|
+
- lib/georgia/indexer/tire/georgia/page.rb
|
809
|
+
- lib/georgia/indexer/tire/georgia/message.rb
|
810
|
+
- lib/georgia/indexer/tire/ckeditor/asset.rb
|
811
|
+
- lib/georgia/indexer/solr/georgia/page.rb
|
812
|
+
- lib/georgia/indexer/solr/georgia/message.rb
|
813
|
+
- lib/georgia/indexer/solr/ckeditor/asset.rb
|
814
|
+
- lib/georgia/indexer/adapter.rb
|
827
815
|
- MIT-LICENSE
|
828
816
|
- Rakefile
|
829
817
|
- README.md
|
@@ -1,29 +0,0 @@
|
|
1
|
-
module Sunspot
|
2
|
-
class HighlightedHitDecorator < ::ApplicationDecorator
|
3
|
-
|
4
|
-
def method_missing(meth, *args, &block)
|
5
|
-
if source.highlights(meth) and source.highlights(meth).present?
|
6
|
-
highlight_text_on(meth)
|
7
|
-
elsif source.stored(meth) and source.stored(meth).is_a? Array
|
8
|
-
source.stored(meth).join(', ')
|
9
|
-
elsif source.stored(meth) and source.stored(meth).present?
|
10
|
-
source.stored(meth)
|
11
|
-
elsif source.result
|
12
|
-
source.result.send(meth)
|
13
|
-
else
|
14
|
-
super
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def source_class_name
|
19
|
-
source.class_name.parameterize
|
20
|
-
end
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
def highlight_text_on key, options={}
|
25
|
-
source.highlights(key).map{|hl| hl.format{|word| h.content_tag(:span, word, class: 'highlight') } }.join().html_safe
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
end
|
@@ -1,67 +0,0 @@
|
|
1
|
-
require 'active_support/concern'
|
2
|
-
|
3
|
-
module Georgia
|
4
|
-
module Concerns
|
5
|
-
module Indexable
|
6
|
-
extend ActiveSupport::Concern
|
7
|
-
|
8
|
-
included do
|
9
|
-
|
10
|
-
class << self
|
11
|
-
|
12
|
-
# Default fields to be include in searchable block
|
13
|
-
# Children of Georgia::Page can use this to extend their own searchable block
|
14
|
-
def indexable_fields
|
15
|
-
Proc.new {
|
16
|
-
text :title, stored: true do
|
17
|
-
revisions.map{|r| r.contents.map(&:title)}.flatten.uniq.join(', ')
|
18
|
-
end
|
19
|
-
text :excerpt, stored: true do
|
20
|
-
revisions.map{|r| r.contents.map(&:excerpt)}.flatten.uniq.join(', ')
|
21
|
-
end
|
22
|
-
text :text do
|
23
|
-
revisions.map{|r| r.contents.map(&:text)}.flatten.uniq.join(', ')
|
24
|
-
end
|
25
|
-
text :keywords do
|
26
|
-
revisions.map{|r| r.contents.map(&:keyword_list)}.flatten.uniq.join(', ')
|
27
|
-
end
|
28
|
-
text :template do
|
29
|
-
revisions.map(&:template).uniq.join(', ')
|
30
|
-
end
|
31
|
-
text :tags do
|
32
|
-
tag_list.join(', ')
|
33
|
-
end
|
34
|
-
text :url
|
35
|
-
string :class_name do
|
36
|
-
self.class.name
|
37
|
-
end
|
38
|
-
string :title
|
39
|
-
string :excerpt
|
40
|
-
string :text
|
41
|
-
string :url
|
42
|
-
string :template
|
43
|
-
string :state do
|
44
|
-
publish_state
|
45
|
-
end
|
46
|
-
string :keywords, stored: true, multiple: true do
|
47
|
-
revisions.map{|r| r.contents.map(&:keyword_list)}.flatten.uniq
|
48
|
-
end
|
49
|
-
string :tag_list, stored: true, multiple: true #Facets (multiple)
|
50
|
-
string :tags do #Ordering (single list)
|
51
|
-
tag_list.join(', ')
|
52
|
-
end
|
53
|
-
time :updated_at # default for ordering
|
54
|
-
}
|
55
|
-
end
|
56
|
-
|
57
|
-
end
|
58
|
-
|
59
|
-
searchable do
|
60
|
-
instance_eval &self.indexable_fields
|
61
|
-
end
|
62
|
-
|
63
|
-
end
|
64
|
-
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
class AddAntiSpamToMessages < ActiveRecord::Migration
|
2
|
-
|
3
|
-
def change
|
4
|
-
add_column :georgia_messages, :spam, :boolean, default: false
|
5
|
-
add_column :georgia_messages, :verified_at, :datetime
|
6
|
-
add_column :georgia_messages, :permalink, :string
|
7
|
-
add_column :georgia_messages, :user_ip, :string
|
8
|
-
add_column :georgia_messages, :user_agent, :string
|
9
|
-
add_column :georgia_messages, :referrer, :string
|
10
|
-
end
|
11
|
-
|
12
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
class AddContentsCounterCacheToImages < ActiveRecord::Migration
|
2
|
-
|
3
|
-
def up
|
4
|
-
add_column :ckeditor_assets, :contents_count, :integer, default: 0
|
5
|
-
Ckeditor::Picture.reset_column_information
|
6
|
-
Ckeditor::Picture.find_each do |u|
|
7
|
-
Ckeditor::Picture.update_counters u.id, :contents_count => u.contents.length
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
def down
|
12
|
-
remove_column :ckeditor_assets, :contents_count
|
13
|
-
end
|
14
|
-
|
15
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
class AddStateToGeorgiaPages < ActiveRecord::Migration
|
2
|
-
|
3
|
-
def up
|
4
|
-
add_column :georgia_pages, :state, :string
|
5
|
-
add_index :georgia_pages, :state
|
6
|
-
end
|
7
|
-
|
8
|
-
def down
|
9
|
-
remove_column :georgia_pages, :state
|
10
|
-
remove_index :georgia_pages, :state
|
11
|
-
end
|
12
|
-
|
13
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
require 'rails/generators/migration'
|
3
|
-
require 'rails/generators/active_record'
|
4
|
-
|
5
|
-
module Georgia
|
6
|
-
module Generators
|
7
|
-
class UpgradeGenerator < ::Rails::Generators::Base
|
8
|
-
include Rails::Generators::Migration
|
9
|
-
|
10
|
-
source_root File.expand_path('../templates', __FILE__)
|
11
|
-
|
12
|
-
desc "Upgrades Georgia CMS to fit latest changes"
|
13
|
-
|
14
|
-
def self.next_migration_number(number)
|
15
|
-
ActiveRecord::Generators::Base.next_migration_number(number)
|
16
|
-
end
|
17
|
-
|
18
|
-
def run_migrations
|
19
|
-
migration_template "add_public_to_georgia_pages.rb", "db/migrate/add_public_to_georgia_pages.rb"
|
20
|
-
migration_template "add_state_to_georgia_pages.rb", "db/migrate/add_state_to_georgia_pages.rb"
|
21
|
-
migration_template "add_anti_spam_to_messages.rb", "db/migrate/add_anti_spam_to_messages.rb"
|
22
|
-
migration_template "create_georgia_revisions.rb", "db/migrate/create_georgia_revisions.rb"
|
23
|
-
migration_template "add_contents_counter_cache_to_images.rb", "db/migrate/add_contents_counter_cache_to_images.rb"
|
24
|
-
rake 'db:migrate'
|
25
|
-
end
|
26
|
-
|
27
|
-
def run_tasks
|
28
|
-
rake 'georgia:statuses'
|
29
|
-
rake 'georgia:revisions'
|
30
|
-
end
|
31
|
-
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|