georgia 0.7.3 → 0.7.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +6 -9
- data/app/assets/javascripts/georgia/ckeditor/config.js +0 -2
- data/app/controllers/georgia/dashboard_controller.rb +4 -2
- data/app/mailers/georgia/notifier.rb +0 -2
- data/app/models/acts_as_taggable_on/tag.rb +9 -0
- data/app/models/ckeditor/asset.rb +6 -3
- data/app/models/georgia/page.rb +6 -1
- data/config/routes.rb +0 -12
- data/lib/georgia.rb +2 -2
- data/lib/georgia/engine.rb +0 -10
- data/lib/georgia/indexer.rb +25 -7
- data/lib/georgia/indexer/extensions/solr_adapter/acts_as_taggable_on_tag.rb +21 -0
- data/lib/georgia/indexer/extensions/solr_adapter/ckeditor_asset.rb +46 -0
- data/lib/georgia/indexer/extensions/solr_adapter/georgia_page.rb +75 -0
- data/lib/georgia/indexer/extensions/tire_adapter/acts_as_taggable_on_tag.rb +24 -0
- data/lib/georgia/indexer/extensions/tire_adapter/ckeditor_asset.rb +41 -0
- data/lib/georgia/indexer/extensions/tire_adapter/georgia_page.rb +55 -0
- data/lib/georgia/indexer/solr_adapter.rb +9 -16
- data/lib/georgia/indexer/tire_adapter.rb +8 -14
- data/lib/georgia/version.rb +1 -1
- metadata +17 -89
- data/app/assets/javascripts/georgia/components/tables/messages.js.coffee +0 -59
- data/app/controllers/georgia/messages_controller.rb +0 -66
- data/app/controllers/messages_controller.rb +0 -29
- data/app/decorators/georgia/message_decorator.rb +0 -21
- data/app/decorators/georgia/messages_decorator.rb +0 -4
- data/app/helpers/georgia/messages_helper.rb +0 -9
- data/app/models/georgia/message.rb +0 -30
- data/app/presenters/georgia/message_actions_presenter.rb +0 -51
- data/app/views/georgia/header/_messages.html.erb +0 -3
- data/app/views/georgia/messages/_message.html.erb +0 -26
- data/app/views/georgia/messages/destroy.js.erb +0 -3
- data/app/views/georgia/messages/search.html.erb +0 -58
- data/app/views/georgia/messages/show.html.erb +0 -46
- data/app/views/messages/create.js.erb +0 -0
- data/app/workers/spam_worker.rb +0 -12
- data/lib/georgia/indexer/adapter.rb +0 -10
- data/lib/georgia/indexer/solr/acts_as_taggable_on/tag.rb +0 -17
- data/lib/georgia/indexer/solr/ckeditor/asset.rb +0 -43
- data/lib/georgia/indexer/solr/georgia/message.rb +0 -31
- data/lib/georgia/indexer/solr/georgia/page.rb +0 -71
- data/lib/georgia/indexer/tire/ckeditor/asset.rb +0 -38
- data/lib/georgia/indexer/tire/georgia/message.rb +0 -41
- data/lib/georgia/indexer/tire/georgia/page.rb +0 -54
@@ -1,29 +0,0 @@
|
|
1
|
-
class MessagesController < ApplicationController
|
2
|
-
|
3
|
-
# Convenient method to create and check for spam
|
4
|
-
def create
|
5
|
-
@message = Georgia::Message.new(message_params)
|
6
|
-
if @message.valid? and @message.save
|
7
|
-
SpamWorker.perform_async(@message.id)
|
8
|
-
end
|
9
|
-
respond_to do |format|
|
10
|
-
# FIXME: Add translated flash message on success and failure
|
11
|
-
format.html { redirect_to :back }
|
12
|
-
format.js { render layout: false }
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
17
|
-
|
18
|
-
def message_params
|
19
|
-
@message_params = {}
|
20
|
-
params[:message].each do |key, value|
|
21
|
-
@message_params[key] = value.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '')
|
22
|
-
end
|
23
|
-
@message_params[:referrer] = request.referrer
|
24
|
-
@message_params[:user_ip] = request.remote_ip
|
25
|
-
@message_params[:user_agent] = request.user_agent
|
26
|
-
@message_params
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module Georgia
|
2
|
-
class MessageDecorator < Georgia::ApplicationDecorator
|
3
|
-
|
4
|
-
def phone_or_none
|
5
|
-
phone.present? ? phone : h.content_tag(:span, 'no phone', class: 'muted')
|
6
|
-
end
|
7
|
-
|
8
|
-
def subject_truncated
|
9
|
-
h.truncate(h.strip_tags(subject), length: 60, separator: ' ').html_safe if subject.present?
|
10
|
-
end
|
11
|
-
|
12
|
-
def message_truncated
|
13
|
-
h.truncate(h.strip_tags(message), length: 200, separator: ' ').html_safe if message.present?
|
14
|
-
end
|
15
|
-
|
16
|
-
def name_or_anonymous
|
17
|
-
name || 'Anonymous'
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
21
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
module Georgia
|
2
|
-
class Message < ActiveRecord::Base
|
3
|
-
|
4
|
-
include Georgia::Indexer
|
5
|
-
|
6
|
-
attr_accessible :name, :email, :subject, :message, :attachment, :phone
|
7
|
-
delegate :url, :current_path, :size, :content_type, :filename, to: :attachment
|
8
|
-
|
9
|
-
validates :name, presence: true
|
10
|
-
validates :email, format: /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
|
11
|
-
validates :message, presence: true
|
12
|
-
|
13
|
-
mount_uploader :attachment, Georgia::AttachmentUploader
|
14
|
-
|
15
|
-
# Anti Spam: check https://github.com/joshfrench/rakismet for more details
|
16
|
-
include Rakismet::Model
|
17
|
-
rakismet_attrs author: :name, author_email: :email, content: :message, comment_type: 'message'
|
18
|
-
attr_accessible :user_ip, :user_agent, :referrer, :spam, :verified_at
|
19
|
-
attr_accessor :permalink, :author_url
|
20
|
-
|
21
|
-
scope :spam, where(spam: true)
|
22
|
-
scope :ham, where(spam: false)
|
23
|
-
scope :latest, order("created_at DESC")
|
24
|
-
|
25
|
-
def status
|
26
|
-
@status ||= spam ? 'spam' : 'clean'
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
30
|
-
end
|
@@ -1,51 +0,0 @@
|
|
1
|
-
module Georgia
|
2
|
-
class MessageActionsPresenter
|
3
|
-
|
4
|
-
attr_reader :view, :message
|
5
|
-
delegate :icon_tag, :content_tag, :link_to, :controller_name, :url_for, :main_app, :can?, :caret_tag, to: :view
|
6
|
-
|
7
|
-
def initialize view, message
|
8
|
-
@view = view
|
9
|
-
@message = (message.decorated? ? message.object : message)
|
10
|
-
end
|
11
|
-
|
12
|
-
def to_s
|
13
|
-
html = ActiveSupport::SafeBuffer.new
|
14
|
-
html << content_tag(:li, link_to_print)
|
15
|
-
if spam?
|
16
|
-
html << content_tag(:li, link_to_ham) if can?(:ham, message)
|
17
|
-
else
|
18
|
-
html << content_tag(:li, link_to_spam) if can?(:spam, message)
|
19
|
-
end
|
20
|
-
html << content_tag(:li, link_to_trash) if can?(:destroy, message)
|
21
|
-
html
|
22
|
-
end
|
23
|
-
|
24
|
-
private
|
25
|
-
|
26
|
-
def link_to_print
|
27
|
-
link_to "#{icon_tag('print')} Print".html_safe, "javascript:window.print()", target: '_blank'
|
28
|
-
end
|
29
|
-
|
30
|
-
def link_to_reply
|
31
|
-
link_to "#{icon_tag('reply')} Reply".html_safe, "mailto:#{@message.email}", target: '_blank'
|
32
|
-
end
|
33
|
-
|
34
|
-
def link_to_ham
|
35
|
-
link_to "#{icon_tag('thumbs-up')} Mark as ham".html_safe, [:ham, @message]
|
36
|
-
end
|
37
|
-
|
38
|
-
def link_to_spam
|
39
|
-
link_to "#{icon_tag('thumbs-down')} Mark as spam".html_safe, [:spam, @message]
|
40
|
-
end
|
41
|
-
|
42
|
-
def link_to_trash
|
43
|
-
link_to "#{icon_tag('trash-o')} Trash".html_safe, @message, method: :delete, data: {confirm: 'Are you sure?'}
|
44
|
-
end
|
45
|
-
|
46
|
-
def spam?
|
47
|
-
@message.spam?
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
51
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
<tr id='<%= dom_id(message) %>' class='message' data-status="<%= message.status %>">
|
2
|
-
<td class='checkbox-cell'>
|
3
|
-
<%= checkboxable_tag message %>
|
4
|
-
</td>
|
5
|
-
<td class='message-name'>
|
6
|
-
<%= link_to message do %>
|
7
|
-
<span><%= message.name %></span>
|
8
|
-
<% end -%>
|
9
|
-
</td>
|
10
|
-
<td class='message-message'>
|
11
|
-
<%= link_to message do %>
|
12
|
-
<span><%= message.subject_truncated %> <small class='muted'><%= message.message_truncated %></small></span>
|
13
|
-
<% end -%>
|
14
|
-
</td>
|
15
|
-
<td class='message-phone'>
|
16
|
-
<%= link_to message do %>
|
17
|
-
<span class="phone"><%= message.phone_or_none %></span>
|
18
|
-
<% end -%>
|
19
|
-
</td>
|
20
|
-
<td class='message-attachment'>
|
21
|
-
<%= icon_tag('paper-clip') %>
|
22
|
-
</td>
|
23
|
-
<td class='message-timestamp'>
|
24
|
-
<%= message.created_at.strftime('%F %H:%M') %>
|
25
|
-
</td>
|
26
|
-
</tr>
|
@@ -1,58 +0,0 @@
|
|
1
|
-
<header class='header-main'>
|
2
|
-
<div class="header-title">
|
3
|
-
<%= form_for :search, url: search_messages_path, method: :get, html: {role: 'search'} do |f| %>
|
4
|
-
<%= hidden_field_tag :s, params[:s] if params[:s] %>
|
5
|
-
<div class="input-group">
|
6
|
-
<div class="input-group-btn">
|
7
|
-
<button class="btn btn-default"><%= icon_tag('search') %></button>
|
8
|
-
</div>
|
9
|
-
<%= text_field_tag :query, params[:query], class: 'form-control input-search', placeholder: 'Search' %>
|
10
|
-
</div>
|
11
|
-
<% end -%>
|
12
|
-
</div>
|
13
|
-
<div class="header-actions">
|
14
|
-
<%= link_to "#{icon_tag('reply')} Reply".html_safe, "mailto:#{@message.email}", class: 'btn btn-warning' if @message %>
|
15
|
-
</div>
|
16
|
-
</header>
|
17
|
-
|
18
|
-
<section class="body-main">
|
19
|
-
|
20
|
-
<table class="table table-hover table-results messages js-checkboxable">
|
21
|
-
<thead>
|
22
|
-
<th colspan='3'>
|
23
|
-
<div class="btn-group">
|
24
|
-
<div class="btn btn-default dropdown-toggle" data-toggle="dropdown">
|
25
|
-
<%= checkboxable_all_tag :messages %>
|
26
|
-
<span class="caret"></span>
|
27
|
-
</div>
|
28
|
-
<ul class="dropdown-menu" role="menu">
|
29
|
-
<li><%= link_to 'All', '#', class: 'js-select-all' %></li>
|
30
|
-
<li><%= link_to 'None', '#', class: 'js-select-none' %></li>
|
31
|
-
<li><%= link_to 'Spam', '#', class: 'js-select-spam' %></li>
|
32
|
-
</ul>
|
33
|
-
</div>
|
34
|
-
<%= link_to "#{icon_tag('thumbs-up')} ham".html_safe, '#', class: 'btn btn-default btn-xs js-ham disabled' %>
|
35
|
-
<%= link_to "#{icon_tag('thumbs-down')} spam".html_safe, '#', class: 'btn btn-default btn-xs js-spam disabled' %>
|
36
|
-
<%= link_to "#{icon_tag('trash-o')} trash".html_safe, '#', class: 'btn btn-default btn-xs js-delete disabled' %>
|
37
|
-
<%#= link_to '#', class: 'btn btn-warning' do %>
|
38
|
-
<%#= icon_tag('tags') %> <%#= icon_tag('caret-down') %>
|
39
|
-
<%# end -%>
|
40
|
-
</th>
|
41
|
-
<th colspan='3'>
|
42
|
-
<%= pagination_tag(@search) %>
|
43
|
-
</th>
|
44
|
-
</thead>
|
45
|
-
<tbody>
|
46
|
-
<% if @messages and @messages.any? %>
|
47
|
-
<%= render @messages %>
|
48
|
-
<% else %>
|
49
|
-
<tr>
|
50
|
-
<td colspan="6">
|
51
|
-
There are currently no messages.
|
52
|
-
</td>
|
53
|
-
</tr>
|
54
|
-
<% end %>
|
55
|
-
</tbody>
|
56
|
-
</table>
|
57
|
-
|
58
|
-
</section>
|
@@ -1,46 +0,0 @@
|
|
1
|
-
<header class='header-main hidden-print'>
|
2
|
-
<div class="header-gutter">
|
3
|
-
<%= link_to_back search_messages_path %>
|
4
|
-
</div>
|
5
|
-
<div class="header-title"></div>
|
6
|
-
<div class="header-actions">
|
7
|
-
</div>
|
8
|
-
</header>
|
9
|
-
|
10
|
-
<section class="body-main">
|
11
|
-
<h2><%= @message.subject %></h2>
|
12
|
-
<div class="message-info">
|
13
|
-
<div class="btn-group pull-right hidden-print">
|
14
|
-
<%= link_to "#{icon_tag('reply')} Reply".html_safe, "mailto:#{@message.email}", class: 'btn btn-warning btn-sm', target: '_blank' %>
|
15
|
-
<button type="button" class="btn btn-warning btn-sm dropdown-toggle" data-toggle="dropdown">
|
16
|
-
<span class="caret"></span>
|
17
|
-
<span class="sr-only">Toggle Dropdown</span>
|
18
|
-
</button>
|
19
|
-
<ul class="dropdown-menu" role="menu">
|
20
|
-
<%= message_actions_list(@message) %>
|
21
|
-
</ul>
|
22
|
-
</div>
|
23
|
-
<strong>
|
24
|
-
<%= @message.name_or_anonymous %>
|
25
|
-
</strong>
|
26
|
-
<span><<%= @message.email %>></span>
|
27
|
-
<span>on <%= @message.created_at.strftime('%F %H:%M') %></span>
|
28
|
-
<span>sent from <%= link_to @message.referrer, @message.referrer %></span>
|
29
|
-
</div>
|
30
|
-
<div class="message-content">
|
31
|
-
<%= @message.message.html_safe %>
|
32
|
-
</div>
|
33
|
-
<div class="message-additional-info">
|
34
|
-
<p>
|
35
|
-
<b>Phone</b>: <%= @message.phone_or_none %>
|
36
|
-
</p>
|
37
|
-
<p>
|
38
|
-
<b>Attachment</b>:
|
39
|
-
<% if @message.attachment.try(:file) and @message.attachment.file.exists? %>
|
40
|
-
<%= link_to @message.attachment.file.filename, @message.attachment.url %>
|
41
|
-
<% else -%>
|
42
|
-
<span class='muted'>There were no attachment.</span>
|
43
|
-
<% end -%>
|
44
|
-
</p>
|
45
|
-
</div>
|
46
|
-
</section>
|
File without changes
|
data/app/workers/spam_worker.rb
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
class SpamWorker
|
2
|
-
include Sidekiq::Worker
|
3
|
-
|
4
|
-
def perform(message_id)
|
5
|
-
@message = Georgia::Message.find(message_id)
|
6
|
-
@message.update_attributes(spam: @message.spam?, verified_at: Time.zone.now)
|
7
|
-
# TODO: Move this to a seperate worker, possibly a single bulk daily email
|
8
|
-
Notifier.notify_info(@message).deliver unless @message.spam
|
9
|
-
end
|
10
|
-
|
11
|
-
|
12
|
-
end
|
@@ -1,43 +0,0 @@
|
|
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
|
-
|
25
|
-
def self.search_index model, params
|
26
|
-
@search = model.search do
|
27
|
-
fulltext params[:query] do
|
28
|
-
fields(:filename, :tags)
|
29
|
-
end
|
30
|
-
with(:extension, params[:e]) unless params[:e].blank?
|
31
|
-
with(:tags).any_of(params[:tg]) unless params[:tg].blank?
|
32
|
-
order_by (params[:o] || :updated_at), (params[:dir] || :desc)
|
33
|
-
paginate(page: params[:page], per_page: (params[:per] || 8))
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
@@ -1,31 +0,0 @@
|
|
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
|
@@ -1,71 +0,0 @@
|
|
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
|