newsletter 3.0.2 → 3.2.0
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 +5 -13
- data/.gitignore +6 -0
- data/.ruby-version +1 -1
- data/Gemfile +17 -5
- data/README.md +40 -0
- data/app/assets/images/newsletter/BottomRight.gif +0 -0
- data/app/assets/images/newsletter/MidRight.gif +0 -0
- data/app/assets/images/newsletter/TopCenter.gif +0 -0
- data/app/assets/images/newsletter/TopRight.gif +0 -0
- data/app/assets/images/newsletter/calendar_date_select/calendar.gif +0 -0
- data/app/assets/images/newsletter/iReach_logo.gif +0 -0
- data/app/assets/images/newsletter/spacer.gif +0 -0
- data/app/assets/images/newsletter/topMid.gif +0 -0
- data/app/assets/javascripts/newsletter/application.js +6 -0
- data/app/assets/stylesheets/newsletter/admin.css +261 -0
- data/app/assets/stylesheets/newsletter/application.css +3 -1
- data/app/assets/stylesheets/newsletter/nav.css +68 -0
- data/app/assets/stylesheets/newsletter/timepicker.css +54 -0
- data/app/controllers/newsletter/application_controller.rb +5 -26
- data/app/controllers/newsletter/areas_controller.rb +0 -38
- data/app/controllers/newsletter/designs_controller.rb +5 -2
- data/app/controllers/newsletter/elements_controller.rb +7 -7
- data/app/controllers/newsletter/fields_controller.rb +1 -46
- data/app/controllers/newsletter/newsletters_controller.rb +6 -24
- data/app/controllers/newsletter/pieces_controller.rb +8 -21
- data/app/helpers/newsletter/designs_helper.rb +1 -8
- data/app/helpers/newsletter/layout_helper.rb +43 -0
- data/app/helpers/newsletter/newsletters_helper.rb +9 -5
- data/app/models/newsletter/area.rb +1 -4
- data/app/models/newsletter/asset.rb +7 -1
- data/app/models/newsletter/design.rb +48 -34
- data/app/models/newsletter/element.rb +0 -42
- data/app/models/newsletter/field.rb +7 -10
- data/app/models/newsletter/field/inline_asset.rb +15 -2
- data/app/models/newsletter/newsletter.rb +18 -11
- data/app/models/newsletter/piece.rb +20 -24
- data/app/views/layouts/newsletter/application.html.erb +20 -116
- data/app/views/layouts/newsletter/layout.html.erb +15 -0
- data/app/views/newsletter/areas/_area.html.erb +1 -1
- data/app/views/newsletter/designs/_area_fields.html.erb +1 -1
- data/app/views/newsletter/designs/_form.html.erb +11 -29
- data/app/views/newsletter/designs/_newsletter_area.html.erb +2 -2
- data/app/views/newsletter/designs/edit.html.erb +3 -6
- data/app/views/newsletter/designs/index.html.erb +7 -6
- data/app/views/newsletter/designs/new.html.erb +2 -2
- data/app/views/newsletter/designs/show.html.erb +5 -5
- data/app/views/newsletter/elements/_field_fields.html.erb +12 -25
- data/app/views/newsletter/elements/_form.html.erb +38 -34
- data/app/views/newsletter/elements/edit.html.erb +2 -5
- data/app/views/newsletter/elements/index.html.erb +7 -7
- data/app/views/newsletter/elements/new.html.erb +2 -2
- data/app/views/newsletter/elements/show.html.erb +5 -5
- data/app/views/newsletter/fields/_inline_asset.html.erb +12 -32
- data/app/views/newsletter/fields/_text.html.erb +2 -4
- data/app/views/newsletter/fields/_text_area.html.erb +2 -7
- data/app/views/newsletter/newsletters/_form.html.erb +6 -16
- data/app/views/newsletter/newsletters/_head.html.erb +2 -3
- data/app/views/newsletter/newsletters/_newsletter.html.erb +11 -6
- data/app/views/newsletter/newsletters/archive.html.erb +1 -1
- data/app/views/newsletter/newsletters/edit.html.erb +8 -16
- data/app/views/newsletter/newsletters/index.html.erb +7 -7
- data/app/views/newsletter/newsletters/new.html.erb +2 -2
- data/app/views/newsletter/newsletters/show.html.erb +11 -6
- data/app/views/newsletter/pieces/_form.html.erb +1 -8
- data/app/views/newsletter/pieces/edit.html.erb +2 -4
- data/app/views/newsletter/pieces/new.html.erb +3 -5
- data/config/locales/newsletters.en.yml +27 -0
- data/config/routes.rb +4 -4
- data/designs/exports/Example.yml +202 -0
- data/designs/exports/example-export.yaml +481 -87
- data/lib/deleteable.rb +12 -14
- data/lib/newsletter/engine.rb +112 -6
- data/lib/newsletter/version.rb +1 -1
- data/lib/tasks/newsletter.rake +54 -41
- data/newsletter.gemspec +3 -1
- data/spec/test_app/.rspec +2 -0
- data/spec/test_app/app/controllers/application_controller.rb +5 -0
- data/spec/test_app/app/models/ability.rb +8 -0
- data/spec/test_app/app/models/user.rb +10 -0
- data/spec/test_app/app/views/layouts/application.html.erb +3 -1
- data/spec/test_app/config/database.postgres.yml +21 -0
- data/spec/test_app/config/initializers/carrierwave.rb +23 -0
- data/spec/test_app/config/newsletter.yml +6 -3
- data/spec/test_app/config/routes.rb +1 -2
- data/spec/test_app/db/migrate/20131222171230_create_users.rb +13 -0
- data/spec/test_app/db/schema.rb +13 -2
- data/spec/test_app/features/newsletter_management.feature +39 -0
- data/spec/test_app/features/piece_management.feature +20 -0
- data/spec/test_app/features/step_definitions/debugging_steps.rb +3 -0
- data/spec/test_app/features/step_definitions/design_steps.rb +3 -0
- data/spec/test_app/features/step_definitions/login_steps.rb +4 -0
- data/spec/test_app/features/step_definitions/newsletter_steps.rb +24 -0
- data/spec/test_app/features/step_definitions/piece_steps.rb +26 -0
- data/{features → spec/test_app/features}/step_definitions/webrat_steps.rb +10 -6
- data/spec/test_app/features/support/env.rb +36 -0
- data/spec/test_app/features/support/functions.rb +3 -0
- data/{features → spec/test_app/features}/support/paths.rb +10 -1
- data/spec/test_app/lib/debugging.rb +61 -0
- data/spec/test_app/script/full_suite +44 -0
- data/spec/test_app/script/rspec_multi_db +26 -0
- data/spec/test_app/spec/controllers/newsletter/pieces_controller_spec.rb +175 -0
- data/spec/test_app/spec/factories/_functions.rb +19 -0
- data/spec/test_app/spec/factories/assets.rb +8 -0
- data/spec/test_app/spec/factories/designs.rb +1 -1
- data/spec/test_app/spec/factories/newsletters.rb +68 -6
- data/spec/test_app/spec/factories/pieces.rb +8 -0
- data/spec/test_app/spec/factories/users.rb +13 -0
- data/spec/test_app/spec/features/newsletter/design_spec.rb +175 -0
- data/spec/test_app/spec/features/newsletter/element_spec.rb +53 -0
- data/spec/test_app/spec/features/newsletter/newsletter_spec.rb +99 -3
- data/spec/test_app/spec/helpers/newsletter/newsletters_helper_spec.rb +65 -0
- data/spec/test_app/spec/models/newsletter/asset_spec.rb +23 -0
- data/spec/test_app/spec/models/newsletter/design_spec.rb +23 -2
- data/spec/test_app/spec/models/newsletter/element_spec.rb +4 -0
- data/spec/test_app/spec/models/newsletter/inline_asset_spec.rb +43 -0
- data/spec/test_app/spec/models/newsletter/newsletter_spec.rb +102 -2
- data/spec/test_app/spec/models/newsletter/piece_spec.rb +33 -0
- data/spec/test_app/spec/rails_helper.rb +82 -0
- data/spec/test_app/spec/routing/newsletter/pieces_routing_spec.rb +28 -0
- data/spec/test_app/spec/spec_helper.rb +73 -64
- data/spec/test_app/spec/support/carrierwave.rb +7 -0
- data/spec/test_app/spec/support/continuances.rb +18 -0
- data/spec/test_app/spec/support/files/iReach_logo.gif +0 -0
- data/spec/test_app/spec/support/files/test.pdf +0 -0
- data/spec/test_app/spec/support/functions.rb +3 -0
- metadata +145 -726
- data/README +0 -243
- data/README.rdoc +0 -3
- data/app/views/newsletter/elements/_newsletter_field.html.erb +0 -37
- data/features/support/env.rb +0 -17
- data/lib/tasks/newsletter_tasks.rake +0 -4
- data/lib/tasks/rspec.rake +0 -158
- data/spec/spec_helper.rb +0 -55
- data/spec/test_app/db/structure.sql +0 -12
- data/spec/test_app/newsletters/designs/My_Design/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/My_Design/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/My_Design/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/My_Design/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/My_Design/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/My_Design/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/My_Design/layout.html.erb +0 -66
- data/spec/test_app/newsletters/designs/Testo_Changeo/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/Testo_Changeo/layout.html.erb +0 -66
- data/spec/test_app/newsletters/designs/empower_innovative_e-business/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/empower_innovative_e-business/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/empower_innovative_e-business/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/empower_innovative_e-business/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/empower_innovative_e-business/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/empower_innovative_e-business/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/empower_innovative_e-business/layout.html.erb +0 -66
- data/spec/test_app/newsletters/designs/enable_extensible_systems/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/enable_extensible_systems/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/enable_extensible_systems/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/enable_extensible_systems/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/enable_extensible_systems/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/enable_extensible_systems/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/enable_extensible_systems/layout.html.erb +0 -66
- data/spec/test_app/newsletters/designs/engage_innovative_schemas/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/engage_innovative_schemas/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/engage_innovative_schemas/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/engage_innovative_schemas/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/engage_innovative_schemas/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/engage_innovative_schemas/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/engage_innovative_schemas/layout.html.erb +0 -67
- data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/layout.html.erb +0 -66
- data/spec/test_app/newsletters/designs/harness_integrated_partnerships/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/harness_integrated_partnerships/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/harness_integrated_partnerships/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/harness_integrated_partnerships/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/harness_integrated_partnerships/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/harness_integrated_partnerships/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/harness_integrated_partnerships/layout.html.erb +0 -66
- data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/layout.html.erb +0 -66
- data/spec/test_app/newsletters/designs/integrate_mission-critical_systems/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/integrate_mission-critical_systems/layout.html.erb +0 -66
- data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/layout.html.erb +0 -67
- data/spec/test_app/newsletters/designs/iterate_strategic_architectures/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/iterate_strategic_architectures/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/iterate_strategic_architectures/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/iterate_strategic_architectures/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/iterate_strategic_architectures/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/iterate_strategic_architectures/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/iterate_strategic_architectures/layout.html.erb +0 -67
- data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/layout.html.erb +0 -67
- data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/layout.html.erb +0 -67
- data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/layout.html.erb +0 -66
- data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/layout.html.erb +0 -66
- data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/layout.html.erb +0 -67
- data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/layout.html.erb +0 -66
- data/spec/test_app/newsletters/designs/target_enterprise_functionalities/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/target_enterprise_functionalities/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/target_enterprise_functionalities/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/target_enterprise_functionalities/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/target_enterprise_functionalities/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/target_enterprise_functionalities/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/target_enterprise_functionalities/layout.html.erb +0 -67
- data/spec/test_app/newsletters/designs/transition_enterprise_systems/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/transition_enterprise_systems/layout.html.erb +0 -66
- data/spec/test_app/newsletters/designs/utilize_one-to-one_schemas/elements/_left_column_article.html.erb +0 -10
- data/spec/test_app/newsletters/designs/utilize_one-to-one_schemas/elements/_left_column_image.html.erb +0 -2
- data/spec/test_app/newsletters/designs/utilize_one-to-one_schemas/elements/_right_column_article.html.erb +0 -5
- data/spec/test_app/newsletters/designs/utilize_one-to-one_schemas/elements/_right_column_headline.html.erb +0 -1
- data/spec/test_app/newsletters/designs/utilize_one-to-one_schemas/elements/_right_column_image.html.erb +0 -1
- data/spec/test_app/newsletters/designs/utilize_one-to-one_schemas/elements/_right_column_paragraph.html.erb +0 -3
- data/spec/test_app/newsletters/designs/utilize_one-to-one_schemas/layout.html.erb +0 -66
data/lib/deleteable.rb
CHANGED
@@ -2,6 +2,9 @@ module Deleteable
|
|
2
2
|
|
3
3
|
def self.included(receiver)
|
4
4
|
receiver.extend ClassMethods
|
5
|
+
receiver.class_eval do
|
6
|
+
default_scope where("deleted_at IS NULL")
|
7
|
+
end
|
5
8
|
end
|
6
9
|
|
7
10
|
def is_deleted?
|
@@ -17,15 +20,8 @@ module Deleteable
|
|
17
20
|
end
|
18
21
|
|
19
22
|
module ClassMethods
|
20
|
-
def
|
21
|
-
|
22
|
-
args.shift
|
23
|
-
super
|
24
|
-
else
|
25
|
-
with_scope(:find => {:conditions => ["#{table_name}.deleted_at is null"]}) do
|
26
|
-
super
|
27
|
-
end
|
28
|
-
end
|
23
|
+
def deleted
|
24
|
+
unscoped.where("deleted_at IS NOT NULL")
|
29
25
|
end
|
30
26
|
end
|
31
27
|
|
@@ -37,14 +33,16 @@ module DeleteableActions
|
|
37
33
|
end
|
38
34
|
|
39
35
|
def destroy
|
40
|
-
thing =
|
36
|
+
thing = self.class.name.gsub(/s?Controller$/,'').constantize.find(params[:id])
|
41
37
|
thing.delete
|
42
|
-
redirect_to(
|
38
|
+
redirect_to(action: :index)
|
43
39
|
end
|
44
40
|
|
41
|
+
# :nocov: - not currently supported
|
45
42
|
def undelete
|
46
|
-
thing =
|
43
|
+
thing = self.class.name.gsub(/s?Controller$/,'').constantize.find(params[:id])
|
47
44
|
thing.undelete
|
48
|
-
redirect_to(
|
45
|
+
redirect_to(action: :index)
|
49
46
|
end
|
50
|
-
|
47
|
+
# :nocov:
|
48
|
+
end
|
data/lib/newsletter/engine.rb
CHANGED
@@ -6,8 +6,36 @@ require 'nested_form'
|
|
6
6
|
require 'carrierwave'
|
7
7
|
require 'carrierwave/orm/activerecord'
|
8
8
|
module Newsletter
|
9
|
-
|
10
|
-
|
9
|
+
# namespace for newsletter tables in database i.e. newsletter_
|
10
|
+
mattr_accessor :table_prefix
|
11
|
+
# path where design text files are saved
|
12
|
+
mattr_accessor :designs_path
|
13
|
+
# the fully qualified url of site i.e. http://www.example.com
|
14
|
+
mattr_accessor :site_url
|
15
|
+
# the path to the site '/' if its at the root or /blarg if the rails engine is at a subpath defaults to '/admin'
|
16
|
+
mattr_accessor :site_path
|
17
|
+
# the default layout for the administration of newsletters
|
18
|
+
mattr_accessor :layout
|
19
|
+
# layout for the newsletter archive
|
20
|
+
mattr_accessor :archive_layout
|
21
|
+
# path to the newsletter assets (will be used for asset uploads)
|
22
|
+
mattr_accessor :asset_path
|
23
|
+
# designs_require_authentication: whether you need to log in to manage designs(recommended)
|
24
|
+
mattr_accessor :designs_require_authentication
|
25
|
+
# design_authorized_roles: array of role names that can manage designs
|
26
|
+
mattr_accessor :design_authorized_roles
|
27
|
+
# newsletters_require_authentication: whether you need to log in to manage newsletters(everyone can currently see them.. devise your own abilities if you want to require login for these)
|
28
|
+
mattr_accessor :newsletters_require_authentication
|
29
|
+
# newsletter_authorized_roles: array of role names that can manage newsletters
|
30
|
+
mattr_accessor :newsletter_authorized_roles
|
31
|
+
# roles_method: the method which gives a list of role names for the 'current_user' of the app, if it answers with an array of names as strings with 'roles' or a string with 'role' this doesn't have to be set
|
32
|
+
mattr_accessor :roles_method
|
33
|
+
|
34
|
+
# the following 2 will probably be deprecated soon
|
35
|
+
# whether or not to redirect to the 'show' page of something after editing/creating or go to the 'index'
|
36
|
+
mattr_accessor :use_show_for_resources
|
37
|
+
# provides a view helper for whether to show a title in a layout/template
|
38
|
+
mattr_accessor :show_title
|
11
39
|
class Engine < ::Rails::Engine
|
12
40
|
isolate_namespace Newsletter
|
13
41
|
initializer "Newsletter.config" do |app|
|
@@ -16,16 +44,86 @@ module Newsletter
|
|
16
44
|
require 'newsletter/settings'
|
17
45
|
::Newsletter.initialize_with_config(::Newsletter::Settings.initialize!)
|
18
46
|
end
|
19
|
-
config.generators do |g|
|
20
|
-
g.test_framework :rspec, :fixture => false
|
21
|
-
g.fixture_replacement :factory_girl, :dir => 'spec/factories'
|
22
|
-
end
|
23
47
|
end
|
48
|
+
initializer "newsletter.factories", :after => "factory_girl.set_factory_paths" do
|
49
|
+
FactoryGirl.definition_file_paths << File.expand_path('../../../spec/test_app/spec/factories', __FILE__) if defined?(FactoryGirl)
|
50
|
+
end
|
51
|
+
config.generators do |g|
|
52
|
+
g.test_framework :rspec, :fixture => false
|
53
|
+
g.fixture_replacement :factory_girl, :dir => 'spec/factories'
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.authorized_for_roles?(user,roles=[])
|
58
|
+
user_roles = if ::Newsletter.roles_method.present?
|
59
|
+
user.send(::Newsletter.roles_method)
|
60
|
+
elsif user.respond_to?(:roles)
|
61
|
+
user.roles
|
62
|
+
elsif user.respond_to?(:role)
|
63
|
+
[user.role]
|
64
|
+
else
|
65
|
+
[]
|
66
|
+
end
|
67
|
+
user_roles = [user_roles] unless user_roles.is_a?(Array)
|
68
|
+
roles.detect{|role| user_roles.map(&:to_sym).map(&:to_s).include?(role.to_s)}.present?
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.authorized?(user, object=nil)
|
72
|
+
if object.eql?(::Newsletter::Design)
|
73
|
+
return true unless ::Newsletter.designs_require_authentication
|
74
|
+
return false if user.blank?
|
75
|
+
return true unless ::Newsletter.design_authorized_roles.present?
|
76
|
+
authorized_for_roles?(user, ::Newsletter.design_authorized_roles)
|
77
|
+
elsif object.eql?(::Newsletter::Newsletter)
|
78
|
+
return true unless ::Newsletter.newsletters_require_authentication
|
79
|
+
return false if user.blank?
|
80
|
+
return true unless ::Newsletter.newsletter_authorized_roles.present?
|
81
|
+
authorized_for_roles?(user, ::Newsletter.newsletter_authorized_roles)
|
82
|
+
else
|
83
|
+
false
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def self.abilities
|
88
|
+
<<-EOT
|
89
|
+
if ::Newsletter.authorized?(user, ::Newsletter::Design)
|
90
|
+
can :manage, [
|
91
|
+
::Newsletter::Design,
|
92
|
+
::Newsletter::Element,
|
93
|
+
::Newsletter::Area,
|
94
|
+
::Newsletter::Field
|
95
|
+
]
|
96
|
+
end
|
97
|
+
if ::Newsletter.authorized?(user, ::Newsletter::Newsletter)
|
98
|
+
can :manage, [
|
99
|
+
::Newsletter::Newsletter,
|
100
|
+
::Newsletter::Piece,
|
101
|
+
::Newsletter::FieldValue
|
102
|
+
]
|
103
|
+
can :read, [
|
104
|
+
::Newsletter::Design,
|
105
|
+
::Newsletter::Element,
|
106
|
+
::Newsletter::Area,
|
107
|
+
::Newsletter::Field
|
108
|
+
]
|
109
|
+
end
|
110
|
+
can :read, [
|
111
|
+
::Newsletter::Newsletter,
|
112
|
+
::Newsletter::Piece,
|
113
|
+
::Newsletter::FieldValue
|
114
|
+
]
|
115
|
+
can :archive, ::Newsletter::Newsletter
|
116
|
+
EOT
|
24
117
|
end
|
118
|
+
|
119
|
+
# an easy way to get the root of the gem's directory structure
|
25
120
|
PLUGIN_ROOT = File.expand_path(File.join(File.dirname(__FILE__),'..','..'))
|
121
|
+
# an easy way to get the root of the gem's assets
|
26
122
|
def self.assets_path
|
27
123
|
File.join(PLUGIN_ROOT,'assets')
|
28
124
|
end
|
125
|
+
# initializes the configuration options pulled from config/newsletter.yml and
|
126
|
+
# overrides with config/newsletter.local.yml if it exists
|
29
127
|
def self.initialize_with_config(conf)
|
30
128
|
::Newsletter.table_prefix ||= conf.table_prefix || 'newsletter_' rescue 'newsletter_'
|
31
129
|
::Newsletter.designs_path ||= conf.designs_path || "#{Rails.root}/designs" rescue "#{Rails.root}/designs"
|
@@ -37,8 +135,16 @@ module Newsletter
|
|
37
135
|
::Newsletter.archive_layout ||= conf.archive_layout || 'application' rescue 'application'
|
38
136
|
::Newsletter.use_show_for_resources ||= conf.use_show_for_resources || false rescue false
|
39
137
|
::Newsletter.asset_path ||= conf.asset_path || 'newsletter_assets' rescue 'newsletter_assets'
|
138
|
+
::Newsletter.show_title ||= conf.show_title || true rescue true
|
139
|
+
::Newsletter.designs_require_authentication ||= conf.designs_require_authentication || false rescue false
|
140
|
+
::Newsletter.newsletters_require_authentication ||= conf.newsletters_require_authentication || false rescue false
|
141
|
+
::Newsletter.design_authorized_roles ||= conf.design_authorized_roles || [] rescue []
|
142
|
+
::Newsletter.newsletter_authorized_roles ||= conf.newsletter_authorized_roles || [] rescue []
|
143
|
+
::Newsletter.roles_method ||= conf.roles_method || '' rescue ''
|
40
144
|
end
|
41
145
|
end
|
146
|
+
|
147
|
+
# initializes mail_manager tie ins
|
42
148
|
Newsletter::Engine.config.to_prepare do
|
43
149
|
Rails.logger.info "Newsletter: Checking for Mail Manager plugin support"
|
44
150
|
begin
|
data/lib/newsletter/version.rb
CHANGED
data/lib/tasks/newsletter.rake
CHANGED
@@ -3,45 +3,12 @@ ENV["Rails.env"] ||= "development"
|
|
3
3
|
require "#{Rails.root}/config/environment"
|
4
4
|
|
5
5
|
namespace :newsletter do
|
6
|
-
desc "Create Newsletter LSI Auth Menus"
|
7
|
-
task :create_auth_menus do
|
8
|
-
Rails.logger.warn "Creating Newsletter LSI Auth Menus"
|
9
|
-
parent_menu = 'Newsletter'
|
10
|
-
AdminMenu.create_or_find(
|
11
|
-
:description=>'Newsletter',
|
12
|
-
:path=>'admin/newsletter/newsletters',
|
13
|
-
:admin_menu_id=>nil,
|
14
|
-
:menu_order=>1,
|
15
|
-
:is_visible=>1,
|
16
|
-
:auth_all=>1)
|
17
|
-
AdminMenu.create_or_find(
|
18
|
-
:description=>'Newsletters',
|
19
|
-
:path=>'admin/newsletter/newsletters',
|
20
|
-
:admin_menu_id=>AdminMenu.find_by_description('Newsletter').id,
|
21
|
-
:menu_order=>1,
|
22
|
-
:is_visible=>1,
|
23
|
-
:auth_all=>1)
|
24
|
-
AdminMenu.create_or_find(
|
25
|
-
:description=>'Newsletter General Auth',
|
26
|
-
:path=>'admin/newsletter',
|
27
|
-
:admin_menu_id=>nil,
|
28
|
-
:menu_order=>0,
|
29
|
-
:is_visible=>0,
|
30
|
-
:auth_all=>1)
|
31
|
-
AdminMenu.create!(
|
32
|
-
:description=>'Designs',
|
33
|
-
:path=>'admin/newsletter/designs',
|
34
|
-
:admin_menu_id=>AdminMenu.find_by_description('Newsletter').id,
|
35
|
-
:menu_order=>1,
|
36
|
-
:is_visible=>1,
|
37
|
-
:auth_all=>1)
|
38
|
-
end
|
39
|
-
|
40
6
|
desc "Import Example Newsletter Design"
|
41
|
-
task :import_example_design do
|
42
|
-
Rails.logger.warn "Importing Example Newsletter Design"
|
7
|
+
task :import_example_design, :design_name do |t,args|
|
8
|
+
Rails.logger.warn "Importing Example Newsletter Design with name: #{args.design_name}"
|
43
9
|
Newsletter::Design.import(
|
44
|
-
File.join(Newsletter::PLUGIN_ROOT,'designs','exports','example-export.yaml')
|
10
|
+
File.join(Newsletter::PLUGIN_ROOT,'designs','exports','example-export.yaml'),
|
11
|
+
args.design_name
|
45
12
|
)
|
46
13
|
end
|
47
14
|
desc "Add defaults to config/newsletter.yml"
|
@@ -53,12 +20,58 @@ namespace :newsletter do
|
|
53
20
|
app_config = Hash.new
|
54
21
|
end
|
55
22
|
File.open('config/newsletter.yml','w') do |file|
|
23
|
+
file.write <<EOT
|
24
|
+
# this file is used to configure the newsletter gem
|
25
|
+
# it works like an older gem called AppConfig
|
26
|
+
# all environments start with settings from the 'common' section
|
27
|
+
# and are overridden by the section that matches the environment's name
|
28
|
+
# also .. if you create a 'config/newsletter.local.yml' it will override
|
29
|
+
# what is in 'config/newsletter.yml' such that you can keep a version
|
30
|
+
# for local settings and not overwrite one that you include in your source control
|
31
|
+
# also ... these files allow the use of erb syntax to set variables with ruby thus
|
32
|
+
# allowing ENV variables and such to be used
|
33
|
+
# here are the valid settings and what they are for:
|
34
|
+
# site_url: used in various places to get the url of the site (such as in mailings templates)
|
35
|
+
# site_path: used in various places to get the url of the site (such as in mailings templates)
|
36
|
+
# layout: layout used for newsletter administration pages
|
37
|
+
# archive_layout: layout used for public facing pages like the newsletter archive
|
38
|
+
# designs_require_authentication: whether you need to log in to manage designs(recommended)
|
39
|
+
# design_authorized_roles: array of role names that can manage designs
|
40
|
+
# newsletters_require_authentication: whether you need to log in to manage newsletters(everyone can currently see them.. devise your own abilities if you want to require login for these)
|
41
|
+
# newsletter_authorized_roles: array of role names that can manage newsletters
|
42
|
+
# roles_method: the method which gives a list of role names for the 'current_user' of the app, if it answers with an array of names as strings with 'roles' or a string with 'role' this doesn't have to be set
|
43
|
+
# designs_path: path from your rails root where design templates are saved
|
44
|
+
# asset_path: where your newsletter assets are saved(images, pdfs, etc for newsletter instances-uploaded with carrier_wave)
|
45
|
+
# table_prefix: prefix your newsletter tables to avoid collisions
|
46
|
+
#
|
47
|
+
#
|
48
|
+
# The following 2 might be deprecated soon
|
49
|
+
# show_title: can be used in templates/layouts to see whether you should show a title
|
50
|
+
# use_show_for_resources: whether to have links to "show" actions - we don't use them really in this app..
|
51
|
+
# and the 'show' actions aren't really currently supported
|
52
|
+
EOT
|
56
53
|
file.write YAML.dump({
|
57
54
|
'common' => {
|
58
|
-
'
|
59
|
-
'
|
60
|
-
'
|
61
|
-
'
|
55
|
+
'site_url' => 'http://example.com',
|
56
|
+
'layout' => 'newsletter/application',
|
57
|
+
'archive_layout' => 'layout',
|
58
|
+
'use_show_for_resources' => false,
|
59
|
+
'show_title' => true,
|
60
|
+
'designs_require_authentication' => false,
|
61
|
+
'design_authorized_roles' => [],
|
62
|
+
'newsletters_require_authentication' => false,
|
63
|
+
'newsletter_authorized_roles' => [],
|
64
|
+
'roles_method' => '',
|
65
|
+
'designs_path' => "<%= File.join(Rails.root,'designs') %>",
|
66
|
+
'asset_path' => 'newsletter_assets',
|
67
|
+
'site_path' => '/admin',
|
68
|
+
'table_prefix' => args.table_prefix
|
69
|
+
},
|
70
|
+
'development' => {
|
71
|
+
'site_url' => 'http://example.dev',
|
72
|
+
},
|
73
|
+
'test' => {
|
74
|
+
'site_url' => 'http://example.lvh.me',
|
62
75
|
}
|
63
76
|
}.deep_merge(app_config))
|
64
77
|
end
|
data/newsletter.gemspec
CHANGED
@@ -11,10 +11,12 @@ Gem::Specification.new do |gem|
|
|
11
11
|
gem.email = ["biz@lone-star.net"]
|
12
12
|
gem.licenses = ['MIT']
|
13
13
|
gem.description = %q{Newsletter templating and management system.}
|
14
|
-
gem.summary = %q{Newsletter templating and management system.}
|
14
|
+
gem.summary = %q{Newsletter templating and management system which allows a designer to create templates that are email-friendly and allows a user to create newsletters with little html/css knowhow.}
|
15
15
|
gem.homepage = "http://ireach.com"
|
16
16
|
|
17
17
|
gem.add_dependency "rails", "~>3.2"
|
18
|
+
gem.add_dependency "jquery-rails", "~>3.1"
|
19
|
+
gem.add_dependency "jquery-ui-rails", "~>5.0"
|
18
20
|
gem.add_dependency "mini_magick", "~>4.1"
|
19
21
|
gem.add_dependency "will_paginate", "~>3.0"
|
20
22
|
gem.add_dependency 'carrierwave', "~>0.10"
|
data/spec/test_app/.rspec
CHANGED
@@ -3,12 +3,14 @@
|
|
3
3
|
<head>
|
4
4
|
<title>TestApp</title>
|
5
5
|
<%= stylesheet_link_tag "application", :media => "all" %>
|
6
|
+
<%= javascript_include_tag "newsletter/application" %>
|
6
7
|
<%= javascript_include_tag "application" %>
|
7
8
|
<%= csrf_meta_tags %>
|
8
9
|
</head>
|
9
10
|
<body>
|
10
|
-
|
11
|
+
<%= yield :page_navigation %>
|
11
12
|
<%= yield %>
|
13
|
+
<%= yield :page_navigation %>
|
12
14
|
|
13
15
|
</body>
|
14
16
|
</html>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
credentials: &credentials
|
2
|
+
encoding: utf8
|
3
|
+
adapter: postgresql
|
4
|
+
username: newsletter
|
5
|
+
password: newsletter_pass
|
6
|
+
host: localhost
|
7
|
+
reconnect: true
|
8
|
+
pool: 5
|
9
|
+
timeout: 5000
|
10
|
+
|
11
|
+
development:
|
12
|
+
<<: *credentials
|
13
|
+
database: mail_manager_development
|
14
|
+
|
15
|
+
test:
|
16
|
+
<<: *credentials
|
17
|
+
database: mail_manager_test
|
18
|
+
|
19
|
+
production:
|
20
|
+
<<: *credentials
|
21
|
+
database: mail_manager
|
@@ -0,0 +1,23 @@
|
|
1
|
+
if Rails.env.test? || Rails.env.cucumber?
|
2
|
+
CarrierWave.configure do |config|
|
3
|
+
config.storage = :file
|
4
|
+
config.enable_processing = false
|
5
|
+
end
|
6
|
+
|
7
|
+
# make sure our uploader is auto-loaded
|
8
|
+
Newsletter::AssetUploader
|
9
|
+
|
10
|
+
# use different dirs when testing
|
11
|
+
CarrierWave::Uploader::Base.descendants.each do |klass|
|
12
|
+
next if klass.anonymous?
|
13
|
+
klass.class_eval do
|
14
|
+
def cache_dir
|
15
|
+
"#{Rails.root}/spec/support/uploads/tmp"
|
16
|
+
end
|
17
|
+
|
18
|
+
def store_dir
|
19
|
+
"#{Rails.root}/spec/support/uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -1,9 +1,12 @@
|
|
1
1
|
---
|
2
2
|
common:
|
3
|
-
site_url: http://newsletter.
|
3
|
+
site_url: http://newsletter.dev
|
4
4
|
table_prefix: news_
|
5
|
-
designs_path: <%= "#{Rails.root}/
|
5
|
+
designs_path: <%= "#{Rails.root}/" %>
|
6
6
|
use_show_for_resources: false
|
7
7
|
asset_path: newsletter_assets
|
8
8
|
site_path: /
|
9
|
-
layout: application
|
9
|
+
layout: newsletter/application
|
10
|
+
test:
|
11
|
+
site_url: http://newsletter.lvh.me:4447
|
12
|
+
designs_path: <%= "#{Rails.root}/tmp" %>
|