cama_subscriber 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/Rakefile +37 -0
- data/app/controllers/plugins/cama_subscriber/admin_controller.rb +13 -0
- data/app/controllers/plugins/cama_subscriber/front_controller.rb +101 -0
- data/app/controllers/plugins/cama_subscriber/groups_controller.rb +46 -0
- data/app/controllers/plugins/cama_subscriber/items_controller.rb +56 -0
- data/app/controllers/plugins/cama_subscriber/promotions_controller.rb +94 -0
- data/app/helpers/plugins/cama_subscriber/main_helper.rb +35 -0
- data/app/models/plugins/cama_subscriber/group.rb +5 -0
- data/app/models/plugins/cama_subscriber/group_item.rb +4 -0
- data/app/models/plugins/cama_subscriber/item.rb +43 -0
- data/app/models/plugins/cama_subscriber/promotion.rb +27 -0
- data/app/models/plugins/cama_subscriber/promotion_group.rb +4 -0
- data/app/models/plugins/cama_subscriber/promotion_item.rb +11 -0
- data/app/models/plugins/cama_subscriber.rb +13 -0
- data/app/views/plugins/cama_subscriber/admin/index.html.erb +9 -0
- data/app/views/plugins/cama_subscriber/admin/settings.html.erb +27 -0
- data/app/views/plugins/cama_subscriber/front/index.html.erb +2 -0
- data/app/views/plugins/cama_subscriber/groups/form.html.erb +17 -0
- data/app/views/plugins/cama_subscriber/groups/index.html.erb +124 -0
- data/app/views/plugins/cama_subscriber/items/form.html.erb +27 -0
- data/app/views/plugins/cama_subscriber/items/index.html.erb +52 -0
- data/app/views/plugins/cama_subscriber/items/show.html.erb +25 -0
- data/app/views/plugins/cama_subscriber/layouts/readme.txt +2 -0
- data/app/views/plugins/cama_subscriber/promotions/form.html.erb +65 -0
- data/app/views/plugins/cama_subscriber/promotions/form_test.html.erb +18 -0
- data/app/views/plugins/cama_subscriber/promotions/index.html.erb +55 -0
- data/app/views/plugins/cama_subscriber/promotions/show.html.erb +25 -0
- data/config/camaleon_plugin.json +19 -0
- data/config/initializers/custom_models.rb +7 -0
- data/config/locales/en.yml +5 -0
- data/config/locales/es.yml +112 -0
- data/config/routes.rb +39 -0
- data/db/migrate/20160319112345_subscriber_structure.rb +65 -0
- data/lib/1x1.png +0 -0
- data/lib/cama_subscriber/engine.rb +4 -0
- data/lib/cama_subscriber/version.rb +3 -0
- data/lib/cama_subscriber.rb +4 -0
- data/lib/tasks/cama_subscriber_tasks.rake +4 -0
- metadata +112 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 9dadd5b701cc1df1e221c0cfc057b31cb93285ed
|
4
|
+
data.tar.gz: 36ea9a87a70856348cdfc1b82249caeb1a9710c4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: df58980a90d0b462c03eb49e752cbd8dec0b34fdaa6d3d6ffbae5b5d2c96ad9c15251c8914d54be8ee739756129be27af1adf8222a2e6f29d5024dfc25c671b3
|
7
|
+
data.tar.gz: 0fdcde8825c8478adc1f81e52d9bbe1e0fe469948c9428d931d5b7c5cd55a1318fec307176702a29071f0274a040c2bd64c74c562ffc6cb135d5997d229253de
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2016 Owen Peredo
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'CamaSubscriber'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.rdoc')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
|
18
|
+
load 'rails/tasks/engine.rake'
|
19
|
+
|
20
|
+
|
21
|
+
load 'rails/tasks/statistics.rake'
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
Bundler::GemHelper.install_tasks
|
26
|
+
|
27
|
+
require 'rake/testtask'
|
28
|
+
|
29
|
+
Rake::TestTask.new(:test) do |t|
|
30
|
+
t.libs << 'lib'
|
31
|
+
t.libs << 'test'
|
32
|
+
t.pattern = 'test/**/*_test.rb'
|
33
|
+
t.verbose = false
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
task default: :test
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class Plugins::CamaSubscriber::AdminController < CamaleonCms::Apps::PluginsAdminController
|
2
|
+
include Plugins::CamaSubscriber::MainHelper
|
3
|
+
add_breadcrumb(I18n.t("plugins.cama_subscriber.title"), default: 'Newsletters')
|
4
|
+
def settings
|
5
|
+
add_breadcrumb(t(".settings", default: 'Settings'))
|
6
|
+
end
|
7
|
+
|
8
|
+
def save_settings
|
9
|
+
@plugin.set_multiple_options(params[:settings])
|
10
|
+
flash[:notice] = t('.saved_settings', default: 'Settings saved')
|
11
|
+
redirect_to action: :settings
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
class Plugins::CamaSubscriber::FrontController < CamaleonCms::Apps::PluginsFrontController
|
2
|
+
include Plugins::CamaSubscriber::MainHelper
|
3
|
+
before_action :init_flash
|
4
|
+
|
5
|
+
def subscribe
|
6
|
+
msg = nil
|
7
|
+
error = []
|
8
|
+
unless params[:email].present?
|
9
|
+
error = t(".email_required", default: 'Your email is required to subscribe for this newsletter')
|
10
|
+
end
|
11
|
+
|
12
|
+
group = params[:group_id].present? ? current_site.subscriber_groups.find(params[:group_id]) : current_site.subscriber_groups.first
|
13
|
+
group = current_site.subscriber_groups.create!(name: 'Default Group', key: 'default_group') unless group.present?
|
14
|
+
|
15
|
+
if group.items.where(email: params[:email]).present?
|
16
|
+
error << t(".already_registered", default: 'You have already subscribed to this newsletter')
|
17
|
+
end
|
18
|
+
|
19
|
+
if error.present?
|
20
|
+
respond_to do |format|
|
21
|
+
format.html { flash[:cama_subscriber][:error] = error.join("<br>"); redirect_to cama_root_url }
|
22
|
+
format.json{ render json: {message: error.join("<br>"), error: true} }
|
23
|
+
end
|
24
|
+
return
|
25
|
+
end
|
26
|
+
|
27
|
+
item = current_site.subscriber_items.where(email: params[:email]).first
|
28
|
+
unless item.present?
|
29
|
+
item = current_site.subscriber_items.new(name: params[:name], email: params[:email])
|
30
|
+
item.status = 'pending' if @plugin.get_option('needs_confirmation') == 1
|
31
|
+
item.save!
|
32
|
+
item.extra_values(params[:extra_values]) if params[:extra_values].present?
|
33
|
+
if @plugin.get_option('needs_confirmation') == 1
|
34
|
+
cama_send_email(params[:email], @plugin.get_option('welcome_subject'), {content: @plugin.get_option('welcome_msg') + "<a href='#{plugins_cama_subscriber_verify_url(key: '')}'></a>"})
|
35
|
+
msg = t(".please_confirm_email", default: 'Your subscription is pending, please confirm your subscription from your email')
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
group.item_groups.create(item_id: item.id)
|
40
|
+
msg = msg || t('.you_have_subscribed', default: 'You have been subscribed successfully')
|
41
|
+
respond_to do |format|
|
42
|
+
format.html { flash[:cama_subscriber][:notice] = msg; redirect_to cama_root_url }
|
43
|
+
format.json{ render json: {message: msg, error: false} }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# confirm subscriber
|
48
|
+
def verify
|
49
|
+
xxx, xx, id_item = Base64.decode64(params[:key]).split('/')
|
50
|
+
current_site.subscriber_items.find(id_item).update(status: 'approved')
|
51
|
+
flash[:cama_subscriber][:notice] = t(".success_confirm", default: 'Your subscription was successfully confirmed.')
|
52
|
+
redirect_to cama_root_url
|
53
|
+
end
|
54
|
+
|
55
|
+
def image_email
|
56
|
+
response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate"
|
57
|
+
response.headers["Pragma"] = "no-cache"
|
58
|
+
response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT"
|
59
|
+
|
60
|
+
promotion_id, sent_promo_id = Base64.decode64(params[:key]).split('/')
|
61
|
+
begin
|
62
|
+
promotion = current_site.subscriber_promotions.find(promotion_id)
|
63
|
+
promotion.sent_promo_items.find(sent_promo_id).increment!
|
64
|
+
rescue
|
65
|
+
end
|
66
|
+
send_file File.join(@plugin.settings['path'], 'lib', '1x1.png'), type: "image/png", disposition: "inline"
|
67
|
+
end
|
68
|
+
|
69
|
+
# unsubscribe from promotion
|
70
|
+
def unsubscribe
|
71
|
+
begin
|
72
|
+
promotion_id, sent_promo_id = Base64.decode64(params[:key]).split('/')
|
73
|
+
promotion = current_site.subscriber_promotions.find(promotion_id)
|
74
|
+
item = promotion.sent_promo_items.find(sent_promo_id).item
|
75
|
+
item.item_groups.where(group_id: promotion.groups.pluck(:id)).destroy_all
|
76
|
+
rescue
|
77
|
+
end
|
78
|
+
|
79
|
+
flash[:cama_subscriber][:notice] = t('.you_have_unsubscribed', default: 'You have been unsubscribed successfully')
|
80
|
+
redirect_to cama_root_url
|
81
|
+
end
|
82
|
+
|
83
|
+
# unsubscribe from all
|
84
|
+
def unsubscribe_all
|
85
|
+
begin
|
86
|
+
promotion_id, sent_promo_id = Base64.decode64(params[:key]).split('/')
|
87
|
+
promotion = current_site.subscriber_promotions.find(promotion_id)
|
88
|
+
item = promotion.sent_promo_items.find(sent_promo_id).item
|
89
|
+
item.unsubscribe!
|
90
|
+
item.item_groups.destroy_all
|
91
|
+
rescue
|
92
|
+
end
|
93
|
+
|
94
|
+
flash[:cama_subscriber][:notice] = t('.you_have_unsubscribed', default: 'You have been unsubscribed successfully')
|
95
|
+
redirect_to cama_root_url
|
96
|
+
end
|
97
|
+
|
98
|
+
def init_flash
|
99
|
+
flash[:cama_subscriber] = {}
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
class Plugins::CamaSubscriber::GroupsController < Plugins::CamaSubscriber::AdminController
|
2
|
+
def index
|
3
|
+
@items = current_site.subscriber_groups
|
4
|
+
end
|
5
|
+
|
6
|
+
def new
|
7
|
+
@item = current_site.subscriber_groups.new
|
8
|
+
render 'form', layout: false
|
9
|
+
end
|
10
|
+
|
11
|
+
def create
|
12
|
+
@item = current_site.subscriber_groups.create(item_params)
|
13
|
+
flash[:notice] = t('.saved', default: 'The group was saved')
|
14
|
+
redirect_to action: :index
|
15
|
+
end
|
16
|
+
|
17
|
+
def edit
|
18
|
+
@item ||= current_site.subscriber_groups.find(params[:id])
|
19
|
+
render 'form', layout: false
|
20
|
+
end
|
21
|
+
|
22
|
+
def update
|
23
|
+
@item = current_site.subscriber_groups.find(params[:id]).update(item_params)
|
24
|
+
flash[:notice] = t('.updated', default: 'The group was udpated')
|
25
|
+
redirect_to action: :index
|
26
|
+
end
|
27
|
+
|
28
|
+
def show
|
29
|
+
@item = current_site.subscriber_groups.find(params[:id])
|
30
|
+
render layout: false
|
31
|
+
end
|
32
|
+
|
33
|
+
def destroy
|
34
|
+
@item = current_site.subscriber_groups.find(params[:id]).destroy
|
35
|
+
flash[:notice] = t('.destroyed', default: 'The group was destroyed')
|
36
|
+
redirect_to action: :index
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
def item_params
|
41
|
+
params.require(:plugins_cama_subscriber_group).permit(
|
42
|
+
:name,
|
43
|
+
:key
|
44
|
+
)
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
class Plugins::CamaSubscriber::ItemsController < Plugins::CamaSubscriber::AdminController
|
2
|
+
def index
|
3
|
+
if params[:group].present?
|
4
|
+
@group = current_site.subscriber_groups.find(params[:group])
|
5
|
+
@items = @group.items
|
6
|
+
else
|
7
|
+
@items = current_site.subscriber_items
|
8
|
+
end
|
9
|
+
@items = @items.paginate(:page => params[:page], :per_page => current_site.admin_per_page)
|
10
|
+
end
|
11
|
+
|
12
|
+
def new
|
13
|
+
@item = current_site.subscriber_items.new
|
14
|
+
render 'form', layout: false
|
15
|
+
end
|
16
|
+
|
17
|
+
def create
|
18
|
+
@item = current_site.subscriber_items.create(item_params)
|
19
|
+
@item.add_groups(params[:groups])
|
20
|
+
flash[:notice] = t('.saved', default: 'The subscription was saved')
|
21
|
+
redirect_to action: :index
|
22
|
+
end
|
23
|
+
|
24
|
+
def edit
|
25
|
+
@item ||= current_site.subscriber_items.find(params[:id])
|
26
|
+
render 'form', layout: false
|
27
|
+
end
|
28
|
+
|
29
|
+
def update
|
30
|
+
@item = current_site.subscriber_items.find(params[:id])
|
31
|
+
@item.update(item_params)
|
32
|
+
@item.add_groups(params[:groups])
|
33
|
+
flash[:notice] = t('.updated', default: 'The subscription was udpated')
|
34
|
+
redirect_to action: :index
|
35
|
+
end
|
36
|
+
|
37
|
+
def show
|
38
|
+
@item = current_site.subscriber_items.find(params[:id])
|
39
|
+
render layout: false
|
40
|
+
end
|
41
|
+
|
42
|
+
def destroy
|
43
|
+
@item = current_site.subscriber_items.find(params[:id]).destroy
|
44
|
+
flash[:notice] = t('.destroyed', default: 'The subscription was destroyed')
|
45
|
+
redirect_to action: :index
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
def item_params
|
50
|
+
params.require(:plugins_cama_subscriber_item).permit(
|
51
|
+
:name,
|
52
|
+
:email,
|
53
|
+
:status
|
54
|
+
)
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
class Plugins::CamaSubscriber::PromotionsController < Plugins::CamaSubscriber::AdminController
|
2
|
+
def index
|
3
|
+
@items = current_site.subscriber_promotions
|
4
|
+
end
|
5
|
+
|
6
|
+
def new
|
7
|
+
@item = current_site.subscriber_promotions.new
|
8
|
+
render 'form', layout: false
|
9
|
+
end
|
10
|
+
|
11
|
+
def create
|
12
|
+
@item = current_site.subscriber_promotions.create(item_params)
|
13
|
+
@item.add_groups(params[:groups])
|
14
|
+
flash[:notice] = t('.saved', default: 'The promotions was saved')
|
15
|
+
redirect_to action: :index
|
16
|
+
end
|
17
|
+
|
18
|
+
def edit
|
19
|
+
@item ||= current_site.subscriber_promotions.find(params[:id])
|
20
|
+
render 'form', layout: false
|
21
|
+
end
|
22
|
+
|
23
|
+
def update
|
24
|
+
@item = current_site.subscriber_promotions.find(params[:id])
|
25
|
+
@item.update(item_params)
|
26
|
+
@item.add_groups(params[:groups])
|
27
|
+
flash[:notice] = t('.updated', default: 'The promotion was udpated')
|
28
|
+
redirect_to action: :index
|
29
|
+
end
|
30
|
+
|
31
|
+
def show
|
32
|
+
@item = current_site.subscriber_promotions.find(params[:id])
|
33
|
+
render layout: false
|
34
|
+
end
|
35
|
+
|
36
|
+
def destroy
|
37
|
+
@item = current_site.subscriber_promotions.find(params[:id]).destroy
|
38
|
+
flash[:notice] = t('.destroyed', default: 'The promotion was destroyed')
|
39
|
+
redirect_to action: :index
|
40
|
+
end
|
41
|
+
|
42
|
+
# send the campaign to items of the groups
|
43
|
+
def send_campaign
|
44
|
+
promotion = current_site.subscriber_promotions.find(params[:promotion_id])
|
45
|
+
if promotion.groups.present?
|
46
|
+
i = 0
|
47
|
+
promotion.items.active.uniq.each do |item|
|
48
|
+
sent_promo = promotion.sent_promo_items.create(item_id: item.id)
|
49
|
+
key = Base64.encode64("#{promotion.id}/#{sent_promo.id}")
|
50
|
+
cama_send_email(item.email, promotion.subject, {
|
51
|
+
from: promotion.email_from,
|
52
|
+
cc_to: promotion.email_cc.split(","),
|
53
|
+
template: promotion.template,
|
54
|
+
layout_name: promotion.layout,
|
55
|
+
content: promotion.content.to_s.gsub('unsubscribe_url', plugins_cama_subscriber_unsubscribe_url(key: key)).gsub('unsubscribe_all_url', plugins_cama_subscriber_unsubscribe_all_url(key: key)) + "<img src='#{plugins_cama_subscriber_image_email_url(key: key)}'>"
|
56
|
+
})
|
57
|
+
i += 1
|
58
|
+
end
|
59
|
+
flash[:notice] = t('.success_send', default: "The campaign was sent successfully to #{i} subscribers", qty: i)
|
60
|
+
promotion.sent!
|
61
|
+
else
|
62
|
+
flash[:error] = t('.error_send', default: 'You need to define at least one group')
|
63
|
+
end
|
64
|
+
redirect_to action: :index
|
65
|
+
end
|
66
|
+
|
67
|
+
def form_test
|
68
|
+
@promotion = current_site.subscriber_promotions.find(params[:promotion_id])
|
69
|
+
render layout: false
|
70
|
+
end
|
71
|
+
|
72
|
+
def send_test
|
73
|
+
promotion = current_site.subscriber_promotions.find(params[:promotion_id])
|
74
|
+
cama_send_email(params[:email], promotion.subject, {from: promotion.email_from, cc_to: promotion.email_cc.split(","), template: promotion.template, layout_name: promotion.layout, content: promotion.content})
|
75
|
+
flash[:notice] = t('.success_test_send', default: 'The test campaign was sent successfully')
|
76
|
+
redirect_to action: :index
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
def item_params
|
81
|
+
params.require(:plugins_cama_subscriber_promotion).permit(
|
82
|
+
:name,
|
83
|
+
:layout,
|
84
|
+
:template,
|
85
|
+
:content,
|
86
|
+
:key,
|
87
|
+
:email_from,
|
88
|
+
:email_cc,
|
89
|
+
:subject,
|
90
|
+
:content,
|
91
|
+
:status
|
92
|
+
)
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Plugins::CamaSubscriber::MainHelper
|
2
|
+
def self.included(klass)
|
3
|
+
# klass.helper_method [:my_helper_method] rescue "" # here your methods accessible from views
|
4
|
+
end
|
5
|
+
|
6
|
+
# here all actions on going to active
|
7
|
+
# you can run sql commands like this:
|
8
|
+
# results = ActiveRecord::Base.connection.execute(query);
|
9
|
+
# plugin: plugin model
|
10
|
+
def cama_subscriber_on_active(plugin)
|
11
|
+
end
|
12
|
+
|
13
|
+
# here all actions on going to inactive
|
14
|
+
# plugin: plugin model
|
15
|
+
def cama_subscriber_on_inactive(plugin)
|
16
|
+
end
|
17
|
+
|
18
|
+
# here all actions to upgrade for a new version
|
19
|
+
# plugin: plugin model
|
20
|
+
def cama_subscriber_on_upgrade(plugin)
|
21
|
+
end
|
22
|
+
|
23
|
+
def cama_subscriber_plugin_options(args)
|
24
|
+
# args[:links] << link_to(t('plugins.cama_subscriber.settings', default: 'Settings'), admin_plugins_cama_subscriber_settings_url).to_s
|
25
|
+
end
|
26
|
+
|
27
|
+
def cama_subscriber_before_admin
|
28
|
+
items = []
|
29
|
+
items << {icon: "group", title: t('plugins.cama_subscriber.items.title', default: 'Subscribers'), url: admin_plugins_cama_subscriber_items_path}
|
30
|
+
items << {icon: "object-ungroup", title: t('plugins.cama_subscriber.groups.title', default: 'Groups'), url: admin_plugins_cama_subscriber_groups_path}
|
31
|
+
items << {icon: "newspaper-o", title: t('plugins.cama_subscriber.promotions.title', default: 'Campaigns'), url: admin_plugins_cama_subscriber_promotions_path}
|
32
|
+
items << {icon: "gear", title: t('plugins.cama_subscriber.settings', default: 'Settings'), url: admin_plugins_cama_subscriber_settings_url}
|
33
|
+
admin_menu_insert_menu_before('settings', 'plugin_subscriber', {icon: "envelope-o", title: t('plugins.cama_subscriber.title', default: 'Subscriptions'), url: '', items: items})
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,5 @@
|
|
1
|
+
class Plugins::CamaSubscriber::Group < ActiveRecord::Base
|
2
|
+
belongs_to :site, class_name: "CamleonCms::Site", foreign_key: :site_id
|
3
|
+
has_many :item_groups, class_name: 'Plugins::CamaSubscriber::GroupItem'
|
4
|
+
has_many :items, class_name: 'Plugins::CamaSubscriber::Item', through: :item_groups
|
5
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
class Plugins::CamaSubscriber::Item < ActiveRecord::Base
|
2
|
+
STATUS = ['approved', 'pending', 'unsubscribed']
|
3
|
+
include CamaleonCms::Metas
|
4
|
+
belongs_to :site, class_name: "CamleonCms::Site", foreign_key: :site_id
|
5
|
+
has_many :item_groups, class_name: 'Plugins::CamaSubscriber::GroupItem'
|
6
|
+
has_many :groups, class_name: 'Plugins::CamaSubscriber::Group', through: :item_groups
|
7
|
+
before_save :check_unsubscribed_status
|
8
|
+
|
9
|
+
scope :active, ->{ where(status: 'approved') }
|
10
|
+
scope :pending, ->{ where(status: 'pending') }
|
11
|
+
scope :unsubscribed, ->{ where(status: 'unsubscribed') }
|
12
|
+
|
13
|
+
# values: (Hash)
|
14
|
+
# sample: {company: 'camaleon cms', city: 'Cochabamba'}
|
15
|
+
def extra_values(values)
|
16
|
+
self.set_multiple_options(values, 'custom_values')
|
17
|
+
end
|
18
|
+
|
19
|
+
# add this item into groups
|
20
|
+
def add_groups(group_ids = [])
|
21
|
+
g = self.groups.pluck(:id)
|
22
|
+
self.item_groups.where(group_id: g - group_ids).destroy_all
|
23
|
+
(group_ids - g).each do |g_id|
|
24
|
+
self.item_groups.create(group_id: g_id)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# unsubscribe user from all groups
|
29
|
+
def unsubscribe!
|
30
|
+
self.update(status: 'unsubscribed')
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
def check_unsubscribed_status
|
35
|
+
if self.status_changed?
|
36
|
+
if self.status == 'unsubscribed'
|
37
|
+
self.unsubscribed_at = Time.current
|
38
|
+
else
|
39
|
+
self.unsubscribed_at = nil
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class Plugins::CamaSubscriber::Promotion < ActiveRecord::Base
|
2
|
+
belongs_to :site, class_name: "CamleonCms::Site", foreign_key: :site_id
|
3
|
+
has_many :promotion_groups, class_name: 'Plugins::CamaSubscriber::PromotionGroup'
|
4
|
+
has_many :groups, class_name: 'Plugins::CamaSubscriber::Group', through: :promotion_groups
|
5
|
+
has_many :items, class_name: 'Plugins::CamaSubscriber::Item', through: :groups
|
6
|
+
|
7
|
+
has_many :sent_promo_items, class_name: 'Plugins::CamaSubscriber::PromotionItem'
|
8
|
+
has_many :sent_items, class_name: 'Plugins::CamaSubscriber::Item', through: :sent_promo_items, source: :item
|
9
|
+
|
10
|
+
# add this item into groups
|
11
|
+
def add_groups(group_ids = [])
|
12
|
+
g = self.groups.pluck(:id)
|
13
|
+
self.promotion_groups.where(group_id: g - group_ids).destroy_all
|
14
|
+
(group_ids - g).each do |g_id|
|
15
|
+
self.promotion_groups.create(group_id: g_id)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# boolean sent or pending campaign
|
20
|
+
def sent?
|
21
|
+
self.status == 'sent'
|
22
|
+
end
|
23
|
+
|
24
|
+
def sent!
|
25
|
+
self.update(status: 'sent')
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class Plugins::CamaSubscriber::PromotionItem < ActiveRecord::Base
|
2
|
+
belongs_to :promotion, class_name: 'Plugins::CamaSubscriber::Promotion'
|
3
|
+
belongs_to :item, class_name: 'Plugins::CamaSubscriber::Item'
|
4
|
+
scope :open, ->{ where.not(qty_opened: 0) }
|
5
|
+
scope :no_open, ->{ where(qty_opened: 0) }
|
6
|
+
# scope :open, ->{ where('last_open_at is not null') }
|
7
|
+
|
8
|
+
def increment!
|
9
|
+
self.update(qty_opened: self.qty_opened + 1)
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
=begin
|
2
|
+
Camaleon CMS is a content management system
|
3
|
+
Copyright (C) 2015 by Owen Peredo Diaz
|
4
|
+
Email: owenperedo@gmail.com
|
5
|
+
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
6
|
+
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
7
|
+
See the GNU Affero General Public License (GPLv3) for more details.
|
8
|
+
=end
|
9
|
+
module Plugins::CamaSubscriber
|
10
|
+
def self.table_name_prefix
|
11
|
+
'plugins_subscriber_'
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<%= form_tag url_for(action: :save_settings) do |f| %>
|
2
|
+
<div class="panel panel-default">
|
3
|
+
<div class="panel-heading">
|
4
|
+
<h4><%= t('.title') %></h4>
|
5
|
+
</div>
|
6
|
+
<div class="panel-body">
|
7
|
+
<%= fields_for :settings, OpenStruct.new(@plugin.options) do |f2| %>
|
8
|
+
<div class="form-group">
|
9
|
+
<label><%= t('.needs_confirmation', default: 'Email subscription needs conrfirmation?') %></label><br>
|
10
|
+
<%= f2.check_box :needs_confirmation %>
|
11
|
+
</div>
|
12
|
+
<div class="form-group">
|
13
|
+
<label><%= t('.welcome_subject', default: 'Welcome Subject') %></label><br>
|
14
|
+
<%= f2.text_field :welcome_subject, class: 'translated form-control' %>
|
15
|
+
</div>
|
16
|
+
<div class="form-group">
|
17
|
+
<label><%= t('.welcome_msg', default: 'Welcome Message') %></label><br>
|
18
|
+
<%= f2.text_area :welcome_msg, class: 'translated form-control' %>
|
19
|
+
</div>
|
20
|
+
<% end %>
|
21
|
+
</div>
|
22
|
+
<div class="panel-footer">
|
23
|
+
<a class="btn btn-default" role="back" href="<%= admin_plugins_cama_subscriber_items_path %>"><%= t('camaleon_cms.admin.button.back') %></a>
|
24
|
+
<button class="btn btn-primary pull-right" type="submit"><%= t('camaleon_cms.admin.button.submit') %></button>
|
25
|
+
</div>
|
26
|
+
</div>
|
27
|
+
<% end %>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<%= form_for [:admin, @item], class: 'validate' do |f| %>
|
2
|
+
<div class="panel panel-default">
|
3
|
+
<div class="panel-body">
|
4
|
+
<div class="form-group">
|
5
|
+
<label><%= t('plugins.cama_subscriber.groups.index.name') %></label><br>
|
6
|
+
<%= f.text_field :name, class: 'form-control required' %>
|
7
|
+
</div>
|
8
|
+
<div class="form-group">
|
9
|
+
<label><%= t('plugins.cama_subscriber.groups.index.key') %></label><br>
|
10
|
+
<%= f.text_field :key, class: 'form-control' %>
|
11
|
+
</div>
|
12
|
+
</div>
|
13
|
+
<div class="panel-footer text-right">
|
14
|
+
<button class="btn btn-primary" type="submit"><%= t('camaleon_cms.admin.button.submit') %></button>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
<% end %>
|