georgia 0.7.3 → 0.7.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -9
  3. data/app/assets/javascripts/georgia/ckeditor/config.js +0 -2
  4. data/app/controllers/georgia/dashboard_controller.rb +4 -2
  5. data/app/mailers/georgia/notifier.rb +0 -2
  6. data/app/models/acts_as_taggable_on/tag.rb +9 -0
  7. data/app/models/ckeditor/asset.rb +6 -3
  8. data/app/models/georgia/page.rb +6 -1
  9. data/config/routes.rb +0 -12
  10. data/lib/georgia.rb +2 -2
  11. data/lib/georgia/engine.rb +0 -10
  12. data/lib/georgia/indexer.rb +25 -7
  13. data/lib/georgia/indexer/extensions/solr_adapter/acts_as_taggable_on_tag.rb +21 -0
  14. data/lib/georgia/indexer/extensions/solr_adapter/ckeditor_asset.rb +46 -0
  15. data/lib/georgia/indexer/extensions/solr_adapter/georgia_page.rb +75 -0
  16. data/lib/georgia/indexer/extensions/tire_adapter/acts_as_taggable_on_tag.rb +24 -0
  17. data/lib/georgia/indexer/extensions/tire_adapter/ckeditor_asset.rb +41 -0
  18. data/lib/georgia/indexer/extensions/tire_adapter/georgia_page.rb +55 -0
  19. data/lib/georgia/indexer/solr_adapter.rb +9 -16
  20. data/lib/georgia/indexer/tire_adapter.rb +8 -14
  21. data/lib/georgia/version.rb +1 -1
  22. metadata +17 -89
  23. data/app/assets/javascripts/georgia/components/tables/messages.js.coffee +0 -59
  24. data/app/controllers/georgia/messages_controller.rb +0 -66
  25. data/app/controllers/messages_controller.rb +0 -29
  26. data/app/decorators/georgia/message_decorator.rb +0 -21
  27. data/app/decorators/georgia/messages_decorator.rb +0 -4
  28. data/app/helpers/georgia/messages_helper.rb +0 -9
  29. data/app/models/georgia/message.rb +0 -30
  30. data/app/presenters/georgia/message_actions_presenter.rb +0 -51
  31. data/app/views/georgia/header/_messages.html.erb +0 -3
  32. data/app/views/georgia/messages/_message.html.erb +0 -26
  33. data/app/views/georgia/messages/destroy.js.erb +0 -3
  34. data/app/views/georgia/messages/search.html.erb +0 -58
  35. data/app/views/georgia/messages/show.html.erb +0 -46
  36. data/app/views/messages/create.js.erb +0 -0
  37. data/app/workers/spam_worker.rb +0 -12
  38. data/lib/georgia/indexer/adapter.rb +0 -10
  39. data/lib/georgia/indexer/solr/acts_as_taggable_on/tag.rb +0 -17
  40. data/lib/georgia/indexer/solr/ckeditor/asset.rb +0 -43
  41. data/lib/georgia/indexer/solr/georgia/message.rb +0 -31
  42. data/lib/georgia/indexer/solr/georgia/page.rb +0 -71
  43. data/lib/georgia/indexer/tire/ckeditor/asset.rb +0 -38
  44. data/lib/georgia/indexer/tire/georgia/message.rb +0 -41
  45. 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,4 +0,0 @@
1
- module Georgia
2
- class MessagesDecorator < PaginationDecorator
3
- end
4
- end
@@ -1,9 +0,0 @@
1
- module Georgia
2
- module MessagesHelper
3
-
4
- def message_actions_list(message)
5
- Georgia::MessageActionsPresenter.new(self, message)
6
- end
7
-
8
- end
9
- 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,3 +0,0 @@
1
- <% if can? :index, Georgia::Message %>
2
- <%= sidebar_navigation_link 'Messages', georgia.search_messages_url, controller: 'messages', icon: 'envelope' %>
3
- <% 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,3 +0,0 @@
1
- <% @messages.each do |m| %>
2
- $('tr#message_<%= m.id %>').remove()
3
- <% end -%>
@@ -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>&lt;<%= @message.email %>&gt;</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
@@ -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,10 +0,0 @@
1
- module Georgia::Indexer
2
- class Adapter
3
-
4
- # Delegate search to the model
5
- def search model, params
6
- model.search model, params
7
- end
8
-
9
- end
10
- end
@@ -1,17 +0,0 @@
1
- module Georgia
2
- module Indexer
3
- module Solr
4
- module ActsAsTaggableOn
5
- module Tag
6
- def self.extended(base)
7
- base.class_eval do
8
- searchable do
9
- text :name
10
- end
11
- end
12
- end
13
- end
14
- end
15
- end
16
- end
17
- 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