georgia 0.7.1 → 0.7.2
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.
- 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
|