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.
Files changed (259) hide show
  1. checksums.yaml +5 -13
  2. data/.gitignore +6 -0
  3. data/.ruby-version +1 -1
  4. data/Gemfile +17 -5
  5. data/README.md +40 -0
  6. data/app/assets/images/newsletter/BottomRight.gif +0 -0
  7. data/app/assets/images/newsletter/MidRight.gif +0 -0
  8. data/app/assets/images/newsletter/TopCenter.gif +0 -0
  9. data/app/assets/images/newsletter/TopRight.gif +0 -0
  10. data/app/assets/images/newsletter/calendar_date_select/calendar.gif +0 -0
  11. data/app/assets/images/newsletter/iReach_logo.gif +0 -0
  12. data/app/assets/images/newsletter/spacer.gif +0 -0
  13. data/app/assets/images/newsletter/topMid.gif +0 -0
  14. data/app/assets/javascripts/newsletter/application.js +6 -0
  15. data/app/assets/stylesheets/newsletter/admin.css +261 -0
  16. data/app/assets/stylesheets/newsletter/application.css +3 -1
  17. data/app/assets/stylesheets/newsletter/nav.css +68 -0
  18. data/app/assets/stylesheets/newsletter/timepicker.css +54 -0
  19. data/app/controllers/newsletter/application_controller.rb +5 -26
  20. data/app/controllers/newsletter/areas_controller.rb +0 -38
  21. data/app/controllers/newsletter/designs_controller.rb +5 -2
  22. data/app/controllers/newsletter/elements_controller.rb +7 -7
  23. data/app/controllers/newsletter/fields_controller.rb +1 -46
  24. data/app/controllers/newsletter/newsletters_controller.rb +6 -24
  25. data/app/controllers/newsletter/pieces_controller.rb +8 -21
  26. data/app/helpers/newsletter/designs_helper.rb +1 -8
  27. data/app/helpers/newsletter/layout_helper.rb +43 -0
  28. data/app/helpers/newsletter/newsletters_helper.rb +9 -5
  29. data/app/models/newsletter/area.rb +1 -4
  30. data/app/models/newsletter/asset.rb +7 -1
  31. data/app/models/newsletter/design.rb +48 -34
  32. data/app/models/newsletter/element.rb +0 -42
  33. data/app/models/newsletter/field.rb +7 -10
  34. data/app/models/newsletter/field/inline_asset.rb +15 -2
  35. data/app/models/newsletter/newsletter.rb +18 -11
  36. data/app/models/newsletter/piece.rb +20 -24
  37. data/app/views/layouts/newsletter/application.html.erb +20 -116
  38. data/app/views/layouts/newsletter/layout.html.erb +15 -0
  39. data/app/views/newsletter/areas/_area.html.erb +1 -1
  40. data/app/views/newsletter/designs/_area_fields.html.erb +1 -1
  41. data/app/views/newsletter/designs/_form.html.erb +11 -29
  42. data/app/views/newsletter/designs/_newsletter_area.html.erb +2 -2
  43. data/app/views/newsletter/designs/edit.html.erb +3 -6
  44. data/app/views/newsletter/designs/index.html.erb +7 -6
  45. data/app/views/newsletter/designs/new.html.erb +2 -2
  46. data/app/views/newsletter/designs/show.html.erb +5 -5
  47. data/app/views/newsletter/elements/_field_fields.html.erb +12 -25
  48. data/app/views/newsletter/elements/_form.html.erb +38 -34
  49. data/app/views/newsletter/elements/edit.html.erb +2 -5
  50. data/app/views/newsletter/elements/index.html.erb +7 -7
  51. data/app/views/newsletter/elements/new.html.erb +2 -2
  52. data/app/views/newsletter/elements/show.html.erb +5 -5
  53. data/app/views/newsletter/fields/_inline_asset.html.erb +12 -32
  54. data/app/views/newsletter/fields/_text.html.erb +2 -4
  55. data/app/views/newsletter/fields/_text_area.html.erb +2 -7
  56. data/app/views/newsletter/newsletters/_form.html.erb +6 -16
  57. data/app/views/newsletter/newsletters/_head.html.erb +2 -3
  58. data/app/views/newsletter/newsletters/_newsletter.html.erb +11 -6
  59. data/app/views/newsletter/newsletters/archive.html.erb +1 -1
  60. data/app/views/newsletter/newsletters/edit.html.erb +8 -16
  61. data/app/views/newsletter/newsletters/index.html.erb +7 -7
  62. data/app/views/newsletter/newsletters/new.html.erb +2 -2
  63. data/app/views/newsletter/newsletters/show.html.erb +11 -6
  64. data/app/views/newsletter/pieces/_form.html.erb +1 -8
  65. data/app/views/newsletter/pieces/edit.html.erb +2 -4
  66. data/app/views/newsletter/pieces/new.html.erb +3 -5
  67. data/config/locales/newsletters.en.yml +27 -0
  68. data/config/routes.rb +4 -4
  69. data/designs/exports/Example.yml +202 -0
  70. data/designs/exports/example-export.yaml +481 -87
  71. data/lib/deleteable.rb +12 -14
  72. data/lib/newsletter/engine.rb +112 -6
  73. data/lib/newsletter/version.rb +1 -1
  74. data/lib/tasks/newsletter.rake +54 -41
  75. data/newsletter.gemspec +3 -1
  76. data/spec/test_app/.rspec +2 -0
  77. data/spec/test_app/app/controllers/application_controller.rb +5 -0
  78. data/spec/test_app/app/models/ability.rb +8 -0
  79. data/spec/test_app/app/models/user.rb +10 -0
  80. data/spec/test_app/app/views/layouts/application.html.erb +3 -1
  81. data/spec/test_app/config/database.postgres.yml +21 -0
  82. data/spec/test_app/config/initializers/carrierwave.rb +23 -0
  83. data/spec/test_app/config/newsletter.yml +6 -3
  84. data/spec/test_app/config/routes.rb +1 -2
  85. data/spec/test_app/db/migrate/20131222171230_create_users.rb +13 -0
  86. data/spec/test_app/db/schema.rb +13 -2
  87. data/spec/test_app/features/newsletter_management.feature +39 -0
  88. data/spec/test_app/features/piece_management.feature +20 -0
  89. data/spec/test_app/features/step_definitions/debugging_steps.rb +3 -0
  90. data/spec/test_app/features/step_definitions/design_steps.rb +3 -0
  91. data/spec/test_app/features/step_definitions/login_steps.rb +4 -0
  92. data/spec/test_app/features/step_definitions/newsletter_steps.rb +24 -0
  93. data/spec/test_app/features/step_definitions/piece_steps.rb +26 -0
  94. data/{features → spec/test_app/features}/step_definitions/webrat_steps.rb +10 -6
  95. data/spec/test_app/features/support/env.rb +36 -0
  96. data/spec/test_app/features/support/functions.rb +3 -0
  97. data/{features → spec/test_app/features}/support/paths.rb +10 -1
  98. data/spec/test_app/lib/debugging.rb +61 -0
  99. data/spec/test_app/script/full_suite +44 -0
  100. data/spec/test_app/script/rspec_multi_db +26 -0
  101. data/spec/test_app/spec/controllers/newsletter/pieces_controller_spec.rb +175 -0
  102. data/spec/test_app/spec/factories/_functions.rb +19 -0
  103. data/spec/test_app/spec/factories/assets.rb +8 -0
  104. data/spec/test_app/spec/factories/designs.rb +1 -1
  105. data/spec/test_app/spec/factories/newsletters.rb +68 -6
  106. data/spec/test_app/spec/factories/pieces.rb +8 -0
  107. data/spec/test_app/spec/factories/users.rb +13 -0
  108. data/spec/test_app/spec/features/newsletter/design_spec.rb +175 -0
  109. data/spec/test_app/spec/features/newsletter/element_spec.rb +53 -0
  110. data/spec/test_app/spec/features/newsletter/newsletter_spec.rb +99 -3
  111. data/spec/test_app/spec/helpers/newsletter/newsletters_helper_spec.rb +65 -0
  112. data/spec/test_app/spec/models/newsletter/asset_spec.rb +23 -0
  113. data/spec/test_app/spec/models/newsletter/design_spec.rb +23 -2
  114. data/spec/test_app/spec/models/newsletter/element_spec.rb +4 -0
  115. data/spec/test_app/spec/models/newsletter/inline_asset_spec.rb +43 -0
  116. data/spec/test_app/spec/models/newsletter/newsletter_spec.rb +102 -2
  117. data/spec/test_app/spec/models/newsletter/piece_spec.rb +33 -0
  118. data/spec/test_app/spec/rails_helper.rb +82 -0
  119. data/spec/test_app/spec/routing/newsletter/pieces_routing_spec.rb +28 -0
  120. data/spec/test_app/spec/spec_helper.rb +73 -64
  121. data/spec/test_app/spec/support/carrierwave.rb +7 -0
  122. data/spec/test_app/spec/support/continuances.rb +18 -0
  123. data/spec/test_app/spec/support/files/iReach_logo.gif +0 -0
  124. data/spec/test_app/spec/support/files/test.pdf +0 -0
  125. data/spec/test_app/spec/support/functions.rb +3 -0
  126. metadata +145 -726
  127. data/README +0 -243
  128. data/README.rdoc +0 -3
  129. data/app/views/newsletter/elements/_newsletter_field.html.erb +0 -37
  130. data/features/support/env.rb +0 -17
  131. data/lib/tasks/newsletter_tasks.rake +0 -4
  132. data/lib/tasks/rspec.rake +0 -158
  133. data/spec/spec_helper.rb +0 -55
  134. data/spec/test_app/db/structure.sql +0 -12
  135. data/spec/test_app/newsletters/designs/My_Design/elements/_left_column_article.html.erb +0 -10
  136. data/spec/test_app/newsletters/designs/My_Design/elements/_left_column_image.html.erb +0 -2
  137. data/spec/test_app/newsletters/designs/My_Design/elements/_right_column_article.html.erb +0 -5
  138. data/spec/test_app/newsletters/designs/My_Design/elements/_right_column_headline.html.erb +0 -1
  139. data/spec/test_app/newsletters/designs/My_Design/elements/_right_column_image.html.erb +0 -1
  140. data/spec/test_app/newsletters/designs/My_Design/elements/_right_column_paragraph.html.erb +0 -3
  141. data/spec/test_app/newsletters/designs/My_Design/layout.html.erb +0 -66
  142. data/spec/test_app/newsletters/designs/Testo_Changeo/elements/_left_column_article.html.erb +0 -10
  143. data/spec/test_app/newsletters/designs/Testo_Changeo/layout.html.erb +0 -66
  144. data/spec/test_app/newsletters/designs/empower_innovative_e-business/elements/_left_column_article.html.erb +0 -10
  145. data/spec/test_app/newsletters/designs/empower_innovative_e-business/elements/_left_column_image.html.erb +0 -2
  146. data/spec/test_app/newsletters/designs/empower_innovative_e-business/elements/_right_column_article.html.erb +0 -5
  147. data/spec/test_app/newsletters/designs/empower_innovative_e-business/elements/_right_column_headline.html.erb +0 -1
  148. data/spec/test_app/newsletters/designs/empower_innovative_e-business/elements/_right_column_image.html.erb +0 -1
  149. data/spec/test_app/newsletters/designs/empower_innovative_e-business/elements/_right_column_paragraph.html.erb +0 -3
  150. data/spec/test_app/newsletters/designs/empower_innovative_e-business/layout.html.erb +0 -66
  151. data/spec/test_app/newsletters/designs/enable_extensible_systems/elements/_left_column_article.html.erb +0 -10
  152. data/spec/test_app/newsletters/designs/enable_extensible_systems/elements/_left_column_image.html.erb +0 -2
  153. data/spec/test_app/newsletters/designs/enable_extensible_systems/elements/_right_column_article.html.erb +0 -5
  154. data/spec/test_app/newsletters/designs/enable_extensible_systems/elements/_right_column_headline.html.erb +0 -1
  155. data/spec/test_app/newsletters/designs/enable_extensible_systems/elements/_right_column_image.html.erb +0 -1
  156. data/spec/test_app/newsletters/designs/enable_extensible_systems/elements/_right_column_paragraph.html.erb +0 -3
  157. data/spec/test_app/newsletters/designs/enable_extensible_systems/layout.html.erb +0 -66
  158. data/spec/test_app/newsletters/designs/engage_innovative_schemas/elements/_left_column_article.html.erb +0 -10
  159. data/spec/test_app/newsletters/designs/engage_innovative_schemas/elements/_left_column_image.html.erb +0 -2
  160. data/spec/test_app/newsletters/designs/engage_innovative_schemas/elements/_right_column_article.html.erb +0 -5
  161. data/spec/test_app/newsletters/designs/engage_innovative_schemas/elements/_right_column_headline.html.erb +0 -1
  162. data/spec/test_app/newsletters/designs/engage_innovative_schemas/elements/_right_column_image.html.erb +0 -1
  163. data/spec/test_app/newsletters/designs/engage_innovative_schemas/elements/_right_column_paragraph.html.erb +0 -3
  164. data/spec/test_app/newsletters/designs/engage_innovative_schemas/layout.html.erb +0 -67
  165. data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/elements/_left_column_article.html.erb +0 -10
  166. data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/elements/_left_column_image.html.erb +0 -2
  167. data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/elements/_right_column_article.html.erb +0 -5
  168. data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/elements/_right_column_headline.html.erb +0 -1
  169. data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/elements/_right_column_image.html.erb +0 -1
  170. data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/elements/_right_column_paragraph.html.erb +0 -3
  171. data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/layout.html.erb +0 -66
  172. data/spec/test_app/newsletters/designs/harness_integrated_partnerships/elements/_left_column_article.html.erb +0 -10
  173. data/spec/test_app/newsletters/designs/harness_integrated_partnerships/elements/_left_column_image.html.erb +0 -2
  174. data/spec/test_app/newsletters/designs/harness_integrated_partnerships/elements/_right_column_article.html.erb +0 -5
  175. data/spec/test_app/newsletters/designs/harness_integrated_partnerships/elements/_right_column_headline.html.erb +0 -1
  176. data/spec/test_app/newsletters/designs/harness_integrated_partnerships/elements/_right_column_image.html.erb +0 -1
  177. data/spec/test_app/newsletters/designs/harness_integrated_partnerships/elements/_right_column_paragraph.html.erb +0 -3
  178. data/spec/test_app/newsletters/designs/harness_integrated_partnerships/layout.html.erb +0 -66
  179. data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/elements/_left_column_article.html.erb +0 -10
  180. data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/elements/_left_column_image.html.erb +0 -2
  181. data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/elements/_right_column_article.html.erb +0 -5
  182. data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/elements/_right_column_headline.html.erb +0 -1
  183. data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/elements/_right_column_image.html.erb +0 -1
  184. data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/elements/_right_column_paragraph.html.erb +0 -3
  185. data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/layout.html.erb +0 -66
  186. data/spec/test_app/newsletters/designs/integrate_mission-critical_systems/elements/_left_column_article.html.erb +0 -10
  187. data/spec/test_app/newsletters/designs/integrate_mission-critical_systems/layout.html.erb +0 -66
  188. data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/elements/_left_column_article.html.erb +0 -10
  189. data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/elements/_left_column_image.html.erb +0 -2
  190. data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/elements/_right_column_article.html.erb +0 -5
  191. data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/elements/_right_column_headline.html.erb +0 -1
  192. data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/elements/_right_column_image.html.erb +0 -1
  193. data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/elements/_right_column_paragraph.html.erb +0 -3
  194. data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/layout.html.erb +0 -67
  195. data/spec/test_app/newsletters/designs/iterate_strategic_architectures/elements/_left_column_article.html.erb +0 -10
  196. data/spec/test_app/newsletters/designs/iterate_strategic_architectures/elements/_left_column_image.html.erb +0 -2
  197. data/spec/test_app/newsletters/designs/iterate_strategic_architectures/elements/_right_column_article.html.erb +0 -5
  198. data/spec/test_app/newsletters/designs/iterate_strategic_architectures/elements/_right_column_headline.html.erb +0 -1
  199. data/spec/test_app/newsletters/designs/iterate_strategic_architectures/elements/_right_column_image.html.erb +0 -1
  200. data/spec/test_app/newsletters/designs/iterate_strategic_architectures/elements/_right_column_paragraph.html.erb +0 -3
  201. data/spec/test_app/newsletters/designs/iterate_strategic_architectures/layout.html.erb +0 -67
  202. data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/elements/_left_column_article.html.erb +0 -10
  203. data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/elements/_left_column_image.html.erb +0 -2
  204. data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/elements/_right_column_article.html.erb +0 -5
  205. data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/elements/_right_column_headline.html.erb +0 -1
  206. data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/elements/_right_column_image.html.erb +0 -1
  207. data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/elements/_right_column_paragraph.html.erb +0 -3
  208. data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/layout.html.erb +0 -67
  209. data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/elements/_left_column_article.html.erb +0 -10
  210. data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/elements/_left_column_image.html.erb +0 -2
  211. data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/elements/_right_column_article.html.erb +0 -5
  212. data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/elements/_right_column_headline.html.erb +0 -1
  213. data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/elements/_right_column_image.html.erb +0 -1
  214. data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/elements/_right_column_paragraph.html.erb +0 -3
  215. data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/layout.html.erb +0 -67
  216. data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/elements/_left_column_article.html.erb +0 -10
  217. data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/elements/_left_column_image.html.erb +0 -2
  218. data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/elements/_right_column_article.html.erb +0 -5
  219. data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/elements/_right_column_headline.html.erb +0 -1
  220. data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/elements/_right_column_image.html.erb +0 -1
  221. data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/elements/_right_column_paragraph.html.erb +0 -3
  222. data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/layout.html.erb +0 -66
  223. data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/elements/_left_column_article.html.erb +0 -10
  224. data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/elements/_left_column_image.html.erb +0 -2
  225. data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/elements/_right_column_article.html.erb +0 -5
  226. data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/elements/_right_column_headline.html.erb +0 -1
  227. data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/elements/_right_column_image.html.erb +0 -1
  228. data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/elements/_right_column_paragraph.html.erb +0 -3
  229. data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/layout.html.erb +0 -66
  230. data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/elements/_left_column_article.html.erb +0 -10
  231. data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/elements/_left_column_image.html.erb +0 -2
  232. data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/elements/_right_column_article.html.erb +0 -5
  233. data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/elements/_right_column_headline.html.erb +0 -1
  234. data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/elements/_right_column_image.html.erb +0 -1
  235. data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/elements/_right_column_paragraph.html.erb +0 -3
  236. data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/layout.html.erb +0 -67
  237. data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/elements/_left_column_article.html.erb +0 -10
  238. data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/elements/_left_column_image.html.erb +0 -2
  239. data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/elements/_right_column_article.html.erb +0 -5
  240. data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/elements/_right_column_headline.html.erb +0 -1
  241. data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/elements/_right_column_image.html.erb +0 -1
  242. data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/elements/_right_column_paragraph.html.erb +0 -3
  243. data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/layout.html.erb +0 -66
  244. data/spec/test_app/newsletters/designs/target_enterprise_functionalities/elements/_left_column_article.html.erb +0 -10
  245. data/spec/test_app/newsletters/designs/target_enterprise_functionalities/elements/_left_column_image.html.erb +0 -2
  246. data/spec/test_app/newsletters/designs/target_enterprise_functionalities/elements/_right_column_article.html.erb +0 -5
  247. data/spec/test_app/newsletters/designs/target_enterprise_functionalities/elements/_right_column_headline.html.erb +0 -1
  248. data/spec/test_app/newsletters/designs/target_enterprise_functionalities/elements/_right_column_image.html.erb +0 -1
  249. data/spec/test_app/newsletters/designs/target_enterprise_functionalities/elements/_right_column_paragraph.html.erb +0 -3
  250. data/spec/test_app/newsletters/designs/target_enterprise_functionalities/layout.html.erb +0 -67
  251. data/spec/test_app/newsletters/designs/transition_enterprise_systems/elements/_left_column_article.html.erb +0 -10
  252. data/spec/test_app/newsletters/designs/transition_enterprise_systems/layout.html.erb +0 -66
  253. data/spec/test_app/newsletters/designs/utilize_one-to-one_schemas/elements/_left_column_article.html.erb +0 -10
  254. data/spec/test_app/newsletters/designs/utilize_one-to-one_schemas/elements/_left_column_image.html.erb +0 -2
  255. data/spec/test_app/newsletters/designs/utilize_one-to-one_schemas/elements/_right_column_article.html.erb +0 -5
  256. data/spec/test_app/newsletters/designs/utilize_one-to-one_schemas/elements/_right_column_headline.html.erb +0 -1
  257. data/spec/test_app/newsletters/designs/utilize_one-to-one_schemas/elements/_right_column_image.html.erb +0 -1
  258. data/spec/test_app/newsletters/designs/utilize_one-to-one_schemas/elements/_right_column_paragraph.html.erb +0 -3
  259. 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 find(*args)
21
- if args[0] == (:exclusive_scope)
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 = controller_name.singularize.split('_').collect{|string| string.capitalize}.join.constantize.find(params[:id])
36
+ thing = self.class.name.gsub(/s?Controller$/,'').constantize.find(params[:id])
41
37
  thing.delete
42
- redirect_to(eval("#{controller_name}_path(derailed_params)"))
38
+ redirect_to(action: :index)
43
39
  end
44
40
 
41
+ # :nocov: - not currently supported
45
42
  def undelete
46
- thing = controller_name.singularize.split('_').collect{|string| string.capitalize}.join.constantize.find(:exclusive_scope,params[:id])
43
+ thing = self.class.name.gsub(/s?Controller$/,'').constantize.find(params[:id])
47
44
  thing.undelete
48
- redirect_to(eval("#{controller_name}_path(derailed_params)"))
45
+ redirect_to(action: :index)
49
46
  end
50
- end
47
+ # :nocov:
48
+ end
@@ -6,8 +6,36 @@ require 'nested_form'
6
6
  require 'carrierwave'
7
7
  require 'carrierwave/orm/activerecord'
8
8
  module Newsletter
9
- mattr_accessor :table_prefix, :designs_path, :site_url,
10
- :site_path, :layout, :archive_layout, :use_show_for_resources, :asset_path
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
@@ -1,3 +1,3 @@
1
1
  module Newsletter
2
- VERSION = "3.0.2"
2
+ VERSION = "3.2.0"
3
3
  end
@@ -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
- 'newsletters_path' => '<%= "#{RAILS_ROOT}/newsletters" %>',
59
- 'asset_path' => 'public/newsletter_assets',
60
- 'newsletter_path_prefix' => '/admin',
61
- 'newsletter_table_prefix' => args.table_prefix
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
@@ -1 +1,3 @@
1
1
  --color
2
+ --require spec_helper
3
+ --format documentation
@@ -1,3 +1,8 @@
1
1
  class ApplicationController < ActionController::Base
2
2
  protect_from_forgery
3
+ helper_method :current_user
4
+
5
+ def current_user
6
+ nil
7
+ end
3
8
  end
@@ -0,0 +1,8 @@
1
+ class Ability
2
+ include CanCan::Ability
3
+
4
+ def initialize(user)
5
+ eval Newsletter.abilities
6
+ end
7
+ end
8
+
@@ -0,0 +1,10 @@
1
+ class User < ActiveRecord::Base
2
+ attr_accessible :email, :first_name, :last_name, :phone
3
+
4
+ validates :email, uniqueness: true, presence: true
5
+
6
+ def roles
7
+ return ['admin'] if last_name.include?('admin')
8
+ []
9
+ end
10
+ end
@@ -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.lvh.me:4447
3
+ site_url: http://newsletter.dev
4
4
  table_prefix: news_
5
- designs_path: <%= "#{Rails.root}/designs" %>
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" %>