alchemy_crm 2.0.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 (240) hide show
  1. data/.gitignore +22 -0
  2. data/.travis.yml +12 -0
  3. data/Gemfile +21 -0
  4. data/Guardfile +13 -0
  5. data/LICENSE +24 -0
  6. data/README.md +82 -0
  7. data/Rakefile +27 -0
  8. data/alchemy_crm.gemspec +31 -0
  9. data/app/assets/images/.DS_Store +0 -0
  10. data/app/assets/images/alchemy_crm/.DS_Store +0 -0
  11. data/app/assets/images/alchemy_crm/contact-icons.png +0 -0
  12. data/app/assets/images/alchemy_crm/fill_content.gif +0 -0
  13. data/app/assets/images/alchemy_crm/group-icons.png +0 -0
  14. data/app/assets/images/alchemy_crm/mailing-icons.png +0 -0
  15. data/app/assets/images/alchemy_crm/module_icon.png +0 -0
  16. data/app/assets/images/alchemy_crm/newsletter-icons.png +0 -0
  17. data/app/assets/images/alchemy_crm/statistic.png +0 -0
  18. data/app/assets/images/alchemy_crm/tag-icons.png +0 -0
  19. data/app/assets/javascripts/alchemy_crm/alchemy_crm.base.js +65 -0
  20. data/app/assets/javascripts/alchemy_crm/scripts.js +2 -0
  21. data/app/assets/stylesheets/alchemy_crm/base.css.scss +473 -0
  22. data/app/assets/stylesheets/alchemy_crm/styles.css +3 -0
  23. data/app/controllers/alchemy_crm/admin/base_controller.rb +7 -0
  24. data/app/controllers/alchemy_crm/admin/contact_groups_controller.rb +23 -0
  25. data/app/controllers/alchemy_crm/admin/contacts_controller.rb +112 -0
  26. data/app/controllers/alchemy_crm/admin/deliveries_controller.rb +80 -0
  27. data/app/controllers/alchemy_crm/admin/elements_controller_extension.rb +32 -0
  28. data/app/controllers/alchemy_crm/admin/mailings_controller.rb +47 -0
  29. data/app/controllers/alchemy_crm/admin/newsletters_controller.rb +24 -0
  30. data/app/controllers/alchemy_crm/admin/tags_controller.rb +62 -0
  31. data/app/controllers/alchemy_crm/base_controller.rb +5 -0
  32. data/app/controllers/alchemy_crm/contacts_controller.rb +103 -0
  33. data/app/controllers/alchemy_crm/mailings_controller.rb +20 -0
  34. data/app/controllers/alchemy_crm/recipients_controller.rb +35 -0
  35. data/app/controllers/alchemy_crm/subscriptions_controller.rb +57 -0
  36. data/app/helpers/alchemy/pages_helper_extension.rb +18 -0
  37. data/app/helpers/alchemy_crm/admin/base_helper.rb +12 -0
  38. data/app/helpers/alchemy_crm/mailings_helper.rb +190 -0
  39. data/app/mailers/alchemy_crm/bounce_receiver.rb +13 -0
  40. data/app/mailers/alchemy_crm/contacts_mailer.rb +26 -0
  41. data/app/mailers/alchemy_crm/mailings_mailer.rb +48 -0
  42. data/app/mailers/alchemy_crm/subscriptions_mailer.rb +17 -0
  43. data/app/models/alchemy/essence_element_teaser.rb +19 -0
  44. data/app/models/alchemy_crm/contact.rb +264 -0
  45. data/app/models/alchemy_crm/contact_group.rb +26 -0
  46. data/app/models/alchemy_crm/contact_group_filter.rb +26 -0
  47. data/app/models/alchemy_crm/delivery.rb +57 -0
  48. data/app/models/alchemy_crm/element_extension.rb +28 -0
  49. data/app/models/alchemy_crm/mailing.rb +93 -0
  50. data/app/models/alchemy_crm/newsletter.rb +48 -0
  51. data/app/models/alchemy_crm/reaction.rb +9 -0
  52. data/app/models/alchemy_crm/recipient.rb +48 -0
  53. data/app/models/alchemy_crm/subscription.rb +8 -0
  54. data/app/views/alchemy/admin/elements/_view_not_found.text.erb +0 -0
  55. data/app/views/alchemy/admin/elements/fill.js.erb +13 -0
  56. data/app/views/alchemy/admin/elements/link.js.erb +1 -0
  57. data/app/views/alchemy/elements/_newsletter_article_editor.html.erb +4 -0
  58. data/app/views/alchemy/elements/_newsletter_article_view.html.erb +16 -0
  59. data/app/views/alchemy/elements/_newsletter_article_view.text.erb +5 -0
  60. data/app/views/alchemy/elements/_newsletter_greeting_editor.html.erb +3 -0
  61. data/app/views/alchemy/elements/_newsletter_greeting_view.html.erb +11 -0
  62. data/app/views/alchemy/elements/_newsletter_greeting_view.text.erb +6 -0
  63. data/app/views/alchemy/elements/_newsletter_signout_form_editor.html.erb +3 -0
  64. data/app/views/alchemy/elements/_newsletter_signout_form_view.html.erb +32 -0
  65. data/app/views/alchemy/elements/_newsletter_signout_mail_editor.html.erb +4 -0
  66. data/app/views/alchemy/elements/_newsletter_signup_form_editor.html.erb +6 -0
  67. data/app/views/alchemy/elements/_newsletter_signup_form_view.html.erb +78 -0
  68. data/app/views/alchemy/elements/_newsletter_signup_mail_editor.html.erb +4 -0
  69. data/app/views/alchemy/essences/_essence_date_view.text.erb +3 -0
  70. data/app/views/alchemy/essences/_essence_element_teaser_editor.html.erb +31 -0
  71. data/app/views/alchemy/essences/_essence_element_teaser_view.html.erb +1 -0
  72. data/app/views/alchemy/essences/_essence_element_teaser_view.text.erb +3 -0
  73. data/app/views/alchemy/essences/_essence_richtext_view.text.erb +1 -0
  74. data/app/views/alchemy/essences/_essence_text_view.text.erb +1 -0
  75. data/app/views/alchemy/newsletter_layouts/_standard.html.erb +39 -0
  76. data/app/views/alchemy/newsletter_layouts/_standard.text.erb +5 -0
  77. data/app/views/alchemy_crm/admin/contact_groups/_contact_group.html.erb +32 -0
  78. data/app/views/alchemy_crm/admin/contact_groups/_filter.html.erb +30 -0
  79. data/app/views/alchemy_crm/admin/contact_groups/_form.html.erb +47 -0
  80. data/app/views/alchemy_crm/admin/contact_groups/_tag.html.erb +6 -0
  81. data/app/views/alchemy_crm/admin/contact_groups/add_filter.js.erb +9 -0
  82. data/app/views/alchemy_crm/admin/contact_groups/destroy.rjs +1 -0
  83. data/app/views/alchemy_crm/admin/contact_groups/edit.html.erb +1 -0
  84. data/app/views/alchemy_crm/admin/contact_groups/index.html.erb +41 -0
  85. data/app/views/alchemy_crm/admin/contact_groups/new.html.erb +1 -0
  86. data/app/views/alchemy_crm/admin/contacts/_contact.html.erb +44 -0
  87. data/app/views/alchemy_crm/admin/contacts/_form.html.erb +86 -0
  88. data/app/views/alchemy_crm/admin/contacts/destroy.rjs +1 -0
  89. data/app/views/alchemy_crm/admin/contacts/edit.html.erb +1 -0
  90. data/app/views/alchemy_crm/admin/contacts/import.html.erb +33 -0
  91. data/app/views/alchemy_crm/admin/contacts/import.js.erb +2 -0
  92. data/app/views/alchemy_crm/admin/contacts/index.html.erb +51 -0
  93. data/app/views/alchemy_crm/admin/contacts/new.html.erb +1 -0
  94. data/app/views/alchemy_crm/admin/contacts/vcf_import_result.html.erb +49 -0
  95. data/app/views/alchemy_crm/admin/deliveries/_delivery.html.erb +41 -0
  96. data/app/views/alchemy_crm/admin/deliveries/_form.html.erb +65 -0
  97. data/app/views/alchemy_crm/admin/deliveries/_recipient.html.erb +40 -0
  98. data/app/views/alchemy_crm/admin/deliveries/edit.html.erb +1 -0
  99. data/app/views/alchemy_crm/admin/deliveries/index.html.erb +29 -0
  100. data/app/views/alchemy_crm/admin/deliveries/new.html.erb +1 -0
  101. data/app/views/alchemy_crm/admin/deliveries/show.html.erb +66 -0
  102. data/app/views/alchemy_crm/admin/elements/link.rjs +4 -0
  103. data/app/views/alchemy_crm/admin/elements/teasables.html.erb +57 -0
  104. data/app/views/alchemy_crm/admin/mailings/_form.html.erb +43 -0
  105. data/app/views/alchemy_crm/admin/mailings/_mailing.html.erb +75 -0
  106. data/app/views/alchemy_crm/admin/mailings/edit.html.erb +1 -0
  107. data/app/views/alchemy_crm/admin/mailings/edit_content.html.erb +194 -0
  108. data/app/views/alchemy_crm/admin/mailings/import_result.html.erb +37 -0
  109. data/app/views/alchemy_crm/admin/mailings/index.html.erb +39 -0
  110. data/app/views/alchemy_crm/admin/mailings/new.html.erb +1 -0
  111. data/app/views/alchemy_crm/admin/mailings/show.html.erb +1 -0
  112. data/app/views/alchemy_crm/admin/mailings/show.text.erb +1 -0
  113. data/app/views/alchemy_crm/admin/newsletters/_form.html.erb +54 -0
  114. data/app/views/alchemy_crm/admin/newsletters/_newsletter.html.erb +42 -0
  115. data/app/views/alchemy_crm/admin/newsletters/_tag_with_radiobutton.html.erb +7 -0
  116. data/app/views/alchemy_crm/admin/newsletters/destroy.rjs +1 -0
  117. data/app/views/alchemy_crm/admin/newsletters/edit.html.erb +1 -0
  118. data/app/views/alchemy_crm/admin/newsletters/index.html.erb +42 -0
  119. data/app/views/alchemy_crm/admin/newsletters/new.html.erb +10 -0
  120. data/app/views/alchemy_crm/admin/tags/_radio_tag.html.erb +6 -0
  121. data/app/views/alchemy_crm/admin/tags/_tag.html.erb +32 -0
  122. data/app/views/alchemy_crm/admin/tags/edit.html.erb +40 -0
  123. data/app/views/alchemy_crm/admin/tags/index.html.erb +35 -0
  124. data/app/views/alchemy_crm/admin/tags/new.html.erb +16 -0
  125. data/app/views/alchemy_crm/contacts_mailer/signout_mail.html.erb +8 -0
  126. data/app/views/alchemy_crm/contacts_mailer/signout_mail.text.erb +4 -0
  127. data/app/views/alchemy_crm/contacts_mailer/signup_mail.html.erb +11 -0
  128. data/app/views/alchemy_crm/contacts_mailer/signup_mail.text.erb +4 -0
  129. data/app/views/alchemy_crm/mailings/show.html.erb +1 -0
  130. data/app/views/alchemy_crm/mailings_mailer/verification_mail.html.erb +11 -0
  131. data/app/views/alchemy_crm/subscriptions/index.html.erb +23 -0
  132. data/app/views/alchemy_crm/subscriptions_mailer/overview_mail.html.erb +27 -0
  133. data/app/views/alchemy_crm/subscriptions_mailer/overview_mail.text.erb +19 -0
  134. data/app/views/csv_magic/import_errors.html.erb +44 -0
  135. data/app/views/csv_magic/mapper.html.erb +62 -0
  136. data/app/views/layouts/alchemy_crm/mailings.html.erb +212 -0
  137. data/app/views/layouts/alchemy_crm/mailings.text.erb +3 -0
  138. data/config/alchemy_crm.config.yml +21 -0
  139. data/config/authorization_rules.rb +37 -0
  140. data/config/initializers/assets.rb +4 -0
  141. data/config/initializers/delayed_job.rb +6 -0
  142. data/config/locales/alchemy.de.yml +55 -0
  143. data/config/locales/alchemy.en.yml +52 -0
  144. data/config/locales/alchemy_crm.de.yml +196 -0
  145. data/config/locales/alchemy_crm.en.yml +53 -0
  146. data/config/locales/localized_country_select.de.rb +268 -0
  147. data/config/locales/localized_country_select.en.rb +282 -0
  148. data/config/module_definition.yml +30 -0
  149. data/config/routes.rb +71 -0
  150. data/db/migrate/20100708220434_create_mailings.rb +19 -0
  151. data/db/migrate/20100708220534_create_contacts.rb +27 -0
  152. data/db/migrate/20100708220812_create_contact_groups.rb +13 -0
  153. data/db/migrate/20100708221009_create_newsletters.rb +15 -0
  154. data/db/migrate/20100708221319_create_sent_mailings.rb +15 -0
  155. data/db/migrate/20100708221529_create_recipients.rb +21 -0
  156. data/db/migrate/20100708222620_acts_as_taggable_migration.rb +28 -0
  157. data/db/migrate/20100708223324_create_contact_group_filters.rb +17 -0
  158. data/db/migrate/20100708223727_create_newsletter_subscriptions.rb +14 -0
  159. data/db/migrate/20100708223922_create_essence_element_teasers.rb +15 -0
  160. data/db/migrate/20100714172207_create_contact_groups_newsletters.rb +12 -0
  161. data/db/migrate/20100927152601_create_reactions.rb +14 -0
  162. data/db/migrate/20111028091722_acts_as_taggable_on_migration.rb +15 -0
  163. data/db/migrate/20111028200710_add_counter_cache_columns_for_tags.rb +11 -0
  164. data/db/migrate/20111030204931_create_delayed_jobs.rb +21 -0
  165. data/db/migrate/20111104105854_add_deliver_at_to_sent_mailings.rb +9 -0
  166. data/db/migrate/20111104125306_remove_sent_mailing_pdf_id_from_sent_mailings.rb +9 -0
  167. data/db/migrate/20111104131912_add_delivered_at_to_sent_mailings.rb +9 -0
  168. data/db/migrate/20111124145923_namespace_alchemy_crm_models.rb +17 -0
  169. data/db/migrate/20120306115555_add_disabled_to_alchemy_crm_contacts.rb +5 -0
  170. data/db/migrate/20120307160721_rename_alchemy_crm_recipients_sent_mailing_id.rb +5 -0
  171. data/db/migrate/20120315113522_add_url_to_alchemy_crm_reactions.rb +5 -0
  172. data/db/migrate/20120316161333_add_sha1_and_salt_to_alchemy_crm_recipients.rb +6 -0
  173. data/db/migrate/20120320103412_add_indexes_to_alchemy_crm_sha1_columns.rb +7 -0
  174. data/db/migrate/20120321105455_add_queue_to_delayed_jobs.rb +9 -0
  175. data/db/migrate/20120327174301_add_more_indexes_to_alchemy_crm_tables.rb +12 -0
  176. data/lib/alchemy_crm.rb +18 -0
  177. data/lib/alchemy_crm/bounced_delivery.rb +46 -0
  178. data/lib/alchemy_crm/config.rb +28 -0
  179. data/lib/alchemy_crm/engine.rb +40 -0
  180. data/lib/alchemy_crm/i18n_helpers.rb +35 -0
  181. data/lib/alchemy_crm/newsletter_layout.rb +40 -0
  182. data/lib/alchemy_crm/seeder.rb +30 -0
  183. data/lib/alchemy_crm/version.rb +3 -0
  184. data/lib/generators/alchemy_crm/scaffold/files/_standard.html.erb +1 -0
  185. data/lib/generators/alchemy_crm/scaffold/files/_standard.text.erb +1 -0
  186. data/lib/generators/alchemy_crm/scaffold/files/elements.yml +51 -0
  187. data/lib/generators/alchemy_crm/scaffold/files/newsletter_layouts.yml +3 -0
  188. data/lib/generators/alchemy_crm/scaffold/files/newsletters.html.erb +22 -0
  189. data/lib/generators/alchemy_crm/scaffold/files/newsletters.text.erb +4 -0
  190. data/lib/generators/alchemy_crm/scaffold/files/page_layouts.yml +19 -0
  191. data/lib/generators/alchemy_crm/scaffold/scaffold_generator.rb +26 -0
  192. data/lib/tasks/alchemy_crm.rake +28 -0
  193. data/lib/tasks/routes.rake +29 -0
  194. data/rails/init.rb +1 -0
  195. data/recipes/alchemy-mailings-capistrano-tasks.rb +12 -0
  196. data/spec/alchemy_mailings_spec.rb +7 -0
  197. data/spec/config_spec.rb +28 -0
  198. data/spec/controllers/alchemy_crm/contacts_controller_spec.rb +210 -0
  199. data/spec/controllers/alchemy_crm/mailings_controller_spec.rb +89 -0
  200. data/spec/controllers/alchemy_crm/recipients_controller_spec.rb +155 -0
  201. data/spec/dummy/Rakefile +7 -0
  202. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  203. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  204. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  205. data/spec/dummy/config.ru +4 -0
  206. data/spec/dummy/config/alchemy/config.yml +142 -0
  207. data/spec/dummy/config/alchemy/elements.yml +79 -0
  208. data/spec/dummy/config/alchemy/newsletter_layouts.yml +4 -0
  209. data/spec/dummy/config/alchemy/page_layouts.yml +55 -0
  210. data/spec/dummy/config/application.rb +43 -0
  211. data/spec/dummy/config/boot.rb +10 -0
  212. data/spec/dummy/config/database.yml +22 -0
  213. data/spec/dummy/config/environment.rb +5 -0
  214. data/spec/dummy/config/environments/development.rb +30 -0
  215. data/spec/dummy/config/environments/production.rb +60 -0
  216. data/spec/dummy/config/environments/test.rb +39 -0
  217. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  218. data/spec/dummy/config/initializers/inflections.rb +10 -0
  219. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  220. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  221. data/spec/dummy/config/initializers/session_store.rb +8 -0
  222. data/spec/dummy/config/locales/en.yml +5 -0
  223. data/spec/dummy/config/routes.rb +4 -0
  224. data/spec/dummy/db/schema.rb +452 -0
  225. data/spec/dummy/public/404.html +26 -0
  226. data/spec/dummy/public/422.html +26 -0
  227. data/spec/dummy/public/500.html +26 -0
  228. data/spec/dummy/public/favicon.ico +0 -0
  229. data/spec/dummy/script/rails +6 -0
  230. data/spec/helpers/alchemy_crm/mailings_helper_spec.rb +169 -0
  231. data/spec/mailers/alchemy_crm/contacts_mailer_spec.rb +88 -0
  232. data/spec/mailers/alchemy_crm/mailings_mailer_spec.rb +42 -0
  233. data/spec/models/alchemy_crm/contact_group_spec.rb +41 -0
  234. data/spec/models/alchemy_crm/contact_spec.rb +108 -0
  235. data/spec/models/alchemy_crm/delivery_spec.rb +55 -0
  236. data/spec/models/alchemy_crm/mailing_spec.rb +63 -0
  237. data/spec/models/alchemy_crm/newsletter_spec.rb +45 -0
  238. data/spec/spec_helper.rb +58 -0
  239. data/vendor/assets/javascripts/autocomplete-rails.js +16 -0
  240. metadata +438 -0
@@ -0,0 +1,89 @@
1
+ require 'spec_helper'
2
+
3
+ module AlchemyCrm
4
+ describe MailingsController do
5
+
6
+ describe '#show' do
7
+
8
+ before(:each) do
9
+ @newsletter = Newsletter.create!(:name => 'Newsletter', :layout => 'newsletter_layout_standard')
10
+ @mailing = Mailing.create!(:name => 'Mailing', :newsletter => @newsletter)
11
+ end
12
+
13
+ context "receiving an id" do
14
+
15
+ before(:each) do
16
+ get :show, {:id => @mailing.id, :use_route => :alchemy_crm}
17
+ end
18
+
19
+ it "should have a recipient" do
20
+ assigns(:recipient).should_not be(nil)
21
+ end
22
+
23
+ it "should have a fake contact" do
24
+ assigns(:contact).email.should == Contact.fake.email
25
+ end
26
+
27
+ end
28
+
29
+ context "receiving a hash and email from recipient with contact" do
30
+
31
+ before(:each) do
32
+ @contact = Contact.create!({:email => 'jon@doe.com', :firstname => 'Jon', :lastname => 'Doe', :salutation => 'mr', :verified => true}, :as => :admin)
33
+ @recipient = Recipient.create!(:email => 'foo@baz.org', :contact => @contact)
34
+ @delivery = Delivery.create!(:recipients => [@recipient], :mailing => @mailing)
35
+ get :show, {:m => @mailing.sha1, :r => @recipient.sha1, :use_route => :alchemy_crm}
36
+ end
37
+
38
+ it "should assign recipient" do
39
+ assigns(:recipient).should == @recipient
40
+ end
41
+
42
+ it "should assign contact from recipient" do
43
+ assigns(:contact).should == @contact
44
+ end
45
+
46
+ end
47
+
48
+ context "receiving a hash and email from recipient without contact" do
49
+
50
+ before(:each) do
51
+ @recipient = Recipient.create!(:email => 'foo@baz.org')
52
+ @delivery = Delivery.create!(:recipients => [@recipient], :mailing => @mailing)
53
+ get :show, {:m => @mailing.sha1, :r => @recipient.sha1, :use_route => :alchemy_crm}
54
+ end
55
+
56
+ it "should assign recipient" do
57
+ assigns(:recipient).should == @recipient
58
+ end
59
+
60
+ it "should assign new contact from recipients email" do
61
+ assigns(:contact).should be_a_new(Contact)
62
+ assigns(:contact).email.should == "foo@baz.org"
63
+ end
64
+
65
+ end
66
+
67
+ context "rendering" do
68
+
69
+ render_views
70
+
71
+ before(:each) do
72
+ @contact = Contact.create!({:email => 'jon@doe.com', :firstname => 'Jon', :lastname => 'Doe', :salutation => 'mr', :verified => true}, :as => :admin)
73
+ @recipient = Recipient.create!(:email => 'foo@baz.org', :contact => @contact)
74
+ @delivery = Delivery.create!(:recipients => [@recipient], :mailing => @mailing)
75
+ @language_root = Alchemy::Page.create!(:name => 'Language Root', :page_layout => 'standard', :language => Alchemy::Language.get_default, :parent_id => Alchemy::Page.root.id)
76
+ @unsubscribe_page = Alchemy::Page.create!(:name => 'Unsubscribe Page', :page_layout => 'newsletter_signout', :parent_id => @language_root.id, :language => Alchemy::Language.get_default)
77
+ end
78
+
79
+ it "should render the view." do
80
+ lambda {
81
+ get :show, {:m => @mailing.sha1, :r => @recipient.sha1, :use_route => :alchemy_crm}
82
+ }.should_not raise_error
83
+ end
84
+
85
+ end
86
+
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,155 @@
1
+ require 'spec_helper'
2
+
3
+ module AlchemyCrm
4
+ describe RecipientsController do
5
+
6
+ before(:each) do
7
+ @recipient = Recipient.create!(:email => 'foo@baz.org')
8
+ end
9
+
10
+ describe '#reads' do
11
+
12
+ context "receiving a recipient hash" do
13
+
14
+ before(:each) do
15
+ get :reads, {:h => @recipient.sha1, :use_route => :alchemy_crm}
16
+ end
17
+
18
+ it "should record the read and read_at date." do
19
+ @recipient.reload
20
+ @recipient.read.should be_true
21
+ @recipient.read_at.should_not be_nil
22
+ end
23
+
24
+ it "should not render anything." do
25
+ response.code.should == "200"
26
+ response.body.should == " "
27
+ end
28
+
29
+ end
30
+
31
+ context "reading multiple times" do
32
+
33
+ it "should not record the reading any more." do
34
+ @recipient.update_attributes(:read => true)
35
+ get :reads, {:h => @recipient.sha1, :use_route => :alchemy_crm}
36
+ @recipient.read_at_changed?.should == false
37
+ end
38
+
39
+ end
40
+
41
+ context "not receiving a recipient hash" do
42
+
43
+ it "should not raise 404 / RecordNotFound error." do
44
+ lambda {
45
+ get :reads, {:use_route => :alchemy_crm}
46
+ }.should_not raise_error(ActiveRecord::RecordNotFound)
47
+ end
48
+
49
+ it "should not record any reading." do
50
+ get :reads, {:use_route => :alchemy_crm}
51
+ @recipient.reload
52
+ @recipient.read.should be_false
53
+ end
54
+
55
+ end
56
+
57
+ end
58
+
59
+ describe '#reacts' do
60
+
61
+ before(:each) do
62
+ Alchemy::PageLayout.add({"name" => 'standard', "elements" => ['headline']})
63
+ @language_root = Alchemy::Page.create!(:name => 'Language Root', :page_layout => 'standard', :parent_id => Alchemy::Page.root.id, :language => Alchemy::Language.get_default)
64
+ @page = Alchemy::Page.create!(:name => 'Page 1', :page_layout => 'standard', :parent_id => @language_root.id, :language => @language_root.language)
65
+ end
66
+
67
+ context "receiving a redirect url" do
68
+
69
+ before(:each) do
70
+ get :reacts, {:h => @recipient.sha1, :r => "http://google.de", :use_route => 'alchemy_crm'}
71
+ end
72
+
73
+ it "should record the url as reaction for recipient." do
74
+ @recipient.reactions.collect(&:url).should include("http://google.de")
75
+ end
76
+
77
+ it "should redirect to url." do
78
+ response.code.should == "302"
79
+ response.should redirect_to('http://google.de')
80
+ end
81
+
82
+ end
83
+
84
+ context "receiving a page id" do
85
+
86
+ before(:each) do
87
+ get :reacts, {:h => @recipient.sha1, :page_id => @page.id, :use_route => 'alchemy_crm'}
88
+ end
89
+
90
+ it "should record the page id as reaction for recipient." do
91
+ @recipient.reactions.collect(&:page_id).should include(@page.id)
92
+ end
93
+
94
+ it "should redirect to page path." do
95
+ response.code.should == "302"
96
+ response.should redirect_to('/page-1')
97
+ end
98
+
99
+ end
100
+
101
+ context "not receiving a page id" do
102
+
103
+ it "should raise 404 / RecordNotFound." do
104
+ lambda {
105
+ get :reacts, {:h => @recipient.sha1, :use_route => 'alchemy_crm'}
106
+ }.should raise_error(ActiveRecord::RecordNotFound)
107
+ end
108
+
109
+ end
110
+
111
+ context "receiving page id and element id" do
112
+
113
+ before(:each) do
114
+ Alchemy::Element.stub!(:descriptions).and_return([{"name" => "headline"}])
115
+ @element = Alchemy::Element.create!(:name => 'headline', :page => @page)
116
+ get :reacts, {:h => @recipient.sha1, :page_id => @page.id, :element_id => @element.id, :use_route => 'alchemy_crm'}
117
+ end
118
+
119
+ it "should record the page id and element id as reaction for recipient." do
120
+ @recipient.reactions.collect(&:page_id).should include(@page.id)
121
+ @recipient.reactions.collect(&:element_id).should include(@element.id)
122
+ end
123
+
124
+ it "should redirect to page path with element dom id as anchor." do
125
+ response.code.should == "302"
126
+ response.should redirect_to("/page-1##{@element.dom_id}")
127
+ end
128
+
129
+ end
130
+
131
+ context "not receiving a recipient id" do
132
+
133
+ it "should not raise 404 / RecordNotFound." do
134
+ lambda {
135
+ get :reacts, {:r => "http://google.de", :use_route => 'alchemy_crm'}
136
+ }.should_not raise_error(ActiveRecord::RecordNotFound)
137
+ end
138
+
139
+ it "should not record any reactions." do
140
+ get :reacts, {:r => "http://google.de", :use_route => 'alchemy_crm'}
141
+ @recipient.reactions.should be_empty
142
+ end
143
+
144
+ it "should redirect." do
145
+ get :reacts, {:r => "http://google.de", :use_route => 'alchemy_crm'}
146
+ response.code.should == "302"
147
+ response.should redirect_to('http://google.de')
148
+ end
149
+
150
+ end
151
+
152
+ end
153
+
154
+ end
155
+ end
@@ -0,0 +1,7 @@
1
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
2
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+
4
+ require File.expand_path('../config/application', __FILE__)
5
+ require 'rake'
6
+
7
+ Dummy::Application.load_tasks
@@ -0,0 +1,3 @@
1
+ class ApplicationController < ActionController::Base
2
+ protect_from_forgery
3
+ end
@@ -0,0 +1,2 @@
1
+ module ApplicationHelper
2
+ end
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Dummy</title>
5
+ <%= stylesheet_link_tag :all %>
6
+ <%= javascript_include_tag :defaults %>
7
+ <%= csrf_meta_tag %>
8
+ </head>
9
+ <body>
10
+ <h1>Welcome to Alchemy CRM Dummy App</h1>
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
@@ -0,0 +1,4 @@
1
+ # This file is used by Rack-based servers to start the application.
2
+
3
+ require ::File.expand_path('../config/environment', __FILE__)
4
+ run Dummy::Application
@@ -0,0 +1,142 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # = Configuration
4
+ #
5
+ # == This is the global Alchemy configuration file
6
+ # Please override your apps settings in your config/alchemy/config.yml file.
7
+ # You can use a handy rake task to generate it.
8
+ #
9
+ # rake alchemy:app_structure:create:config
10
+
11
+ # The amount of time of inactivity in minutes after which the user is kicked out of his current session.
12
+ # Only active in production environment!!!
13
+ :auto_logout_time: 30
14
+
15
+ # === Redirect options
16
+ # redirect_index: You can set to redirect (an 301 permanent, for all you SEO geeks ^_^) to first child page (typically the homepage) the index/intro page if it's not visible.
17
+ # So you don't get an 404 error if the language root page is not visible.
18
+ # redirect_to_public_child: Alchemy redirects to the first public child page found, if a page is not visible.
19
+ :redirect_index: true
20
+ :redirect_to_public_child: true
21
+
22
+ # Enabling the Ferret fulltext search engine.
23
+ # Tip! For best performance and stability install a crontab that reindexes ferrets search index periodly.
24
+ # Example: cd ~/html/alchemy/current && RAILS_ENV=production rake ferret:rebuild_index
25
+ :ferret: true
26
+
27
+ # === Pagecaching
28
+ # Enable/Disable pagecaching globally.
29
+ # Hint: You can enable/disable page caching for single Alchemy::PageLayouts in the page_layout.yml file.
30
+ :cache_pages: true
31
+
32
+ # === Sitemap
33
+ # Alchemy renders a nice HTML (<ul><li> style) and XML (Google conform!) Sitemap for you.
34
+ # Just place a sitemap element for a page layout in your page_layouts.yml file. Alchemy does the rest.
35
+ # ==== Options:
36
+ # show_root: Show language root page in sitemap?
37
+ # show_flag: enables the Checkbox in Page#update overlay. So your customer can set the visibilit of pages in the sitemap.
38
+ :sitemap:
39
+ :show_root: true
40
+ :show_flag: false
41
+
42
+ # === URL nesting
43
+ # By default Alchemy does not nest page urls respectivley to their page tree position.
44
+ # Enable +url_nesting+ to get nested urls.
45
+ # ==== Example of a nested url:
46
+ # +http://homepage.com/company/history/the-early-years+
47
+ # Alchemy supports url nesting up to three levels deep. We think that's more then enough,
48
+ # because URLs like this are possible:
49
+ # +http://homepage.com/en/2011/12/08/my-post
50
+ url_nesting: false
51
+
52
+ # === Picture rendering settings
53
+ # Alchemy uses Fleximage and RMagick to render images. Use {:image_size => "XXXxYYY", :crop => BOOLEAN [true]} to resize images.
54
+ # See https://github.com/Squeegy/fleximage for further infos.
55
+ # ==== Options:
56
+ # output_image_jpg_quality: If rendered as JPG this is the quality setting for it.
57
+ # preprocess_image_resize: Large images are downsized after upload to save diskspace.
58
+ # image_store_format: Masterimage storage format. Images are rendered from this master image, so a lossless format (png) is strongly recommended.
59
+ # image_output_format: Globally image output format setting.
60
+ # TIP: You can always override the output format in the options of your Essence. I.e. {:format => :gif}
61
+ :output_image_jpg_quality: 85
62
+ :preprocess_image_resize: 1000x1000
63
+ :image_store_format: png
64
+ :image_output_format: jpg
65
+
66
+ # Default language for the seeder.
67
+ default_language:
68
+ code: de
69
+ name: Deutsch
70
+ page_layout: intro
71
+ frontpage_name: Intro
72
+
73
+ # === Mailer Settings:
74
+ #
75
+ # To send Mails via contact forms you can create your form fields here and set which fields are to be validated.
76
+ #
77
+ # ==== Options:
78
+ #
79
+ # fields: An Array from Hashes with fieldname as keys and type as values. Types are ActiveRecord column types (i.e. string, text, boolean, etc.).
80
+ # validate_fields: A Hash with fieldname as key and a Hash (with :message as key and a message_id as value) as value
81
+ #
82
+ # ==== Translating validation messages:
83
+ #
84
+ # The message_id is passed through Alchemy::I18n.t so you can translate it in your language yml file.
85
+ #
86
+ # Example:
87
+ #
88
+ # de:
89
+ # alchemy:
90
+ # contactform:
91
+ # validations:
92
+ # enter_name: 'Bitte geben Sie einen Namen an'
93
+ #
94
+ :mailer:
95
+ :page_layout_name: contact
96
+ :forward_to_page: false
97
+ :mail_success_page: thanks
98
+ :mail_from: your.mail@your-domain.com
99
+ :mail_to: your.mail@your-domain.com
100
+ :fields: [salutation, firstname, lastname, address, zip, city, phone, email, message]
101
+ :validate_fields:
102
+ :lastname:
103
+ :message: enter_name
104
+ :email:
105
+ :message: enter_mail
106
+
107
+ # === User roles
108
+ # You can add own user roles. To set permissions for this roles please add an authorization_rules.rb file in your config folder.
109
+ # Further documentation for the auth system used please visit:
110
+ # https://github.com/stffn/declarative_authorization/blob/master/README.rdoc
111
+ #
112
+ # ==== Translating Userroles
113
+ # Userroles can be translated inside your the language yml file under:
114
+ # alchemy:
115
+ # user_roles:
116
+ # rolename: Name of the role
117
+ :user_roles: [registered, author, editor, admin]
118
+
119
+ # === Uploader Settings
120
+ # upload_limit: Integer Set an amount of files upload limit of files which can be uploaded at once. Set 0 for unlimited.
121
+ # file_size_limit: Integer Set a file size limit in megabytes for a per file limit.
122
+ # Allow filetypes to upload.
123
+ # Pass * to allow all kind of files.
124
+ :uploader:
125
+ :upload_limit: 50
126
+ :file_size_limit: 100
127
+ :allowed_filetypes:
128
+ :pictures: [jpg, jpeg, gif, png, psd, pdf]
129
+ :attachments: ['*']
130
+
131
+ # === Link Target Options
132
+ # Values for the link target selectbox inside the page link overlay.
133
+ # The value gets attached as a data-link-target attribute to the link.
134
+ #
135
+ # == Example:
136
+ # Open all links set to overlay inside an jQuery UI Dialog Window.
137
+ #
138
+ # jQuery(a[data-link-target="overlay"]).dialog();
139
+ :link_target_options: [blank]
140
+
141
+ # Should pages that redirect to an external url open the link in a new tab/window?
142
+ :open_external_links_in_new_tab: true
@@ -0,0 +1,79 @@
1
+ - name: newsletter_greeting
2
+ unique: true
3
+ contents:
4
+ - name: male_greeting
5
+ type: EssenceText
6
+ - name: female_greeting
7
+ type: EssenceText
8
+ - name: text
9
+ type: EssenceRichtext
10
+
11
+ - name: newsletter_article
12
+ contents:
13
+ - name: image
14
+ type: EssencePicture
15
+ - name: headline
16
+ type: EssenceText
17
+ - name: text
18
+ type: EssenceRichtext
19
+ - name: link
20
+ type: EssenceLink
21
+
22
+ # These elements are added by the Alchemy CRM module.
23
+
24
+ - name: newsletter_signup_form
25
+ unique: true
26
+ contents:
27
+ - name: choose_newsletter_text
28
+ type: EssenceRichtext
29
+ - name: signed_up_text
30
+ type: EssenceRichtext
31
+ validate:
32
+ - presence
33
+ - name: verified_text
34
+ type: EssenceRichtext
35
+ validate:
36
+ - presence
37
+ - name: newsletter_signup_mail
38
+ unique: true
39
+ contents:
40
+ - name: mail_from
41
+ type: EssenceText
42
+ validate:
43
+ - presence
44
+ - name: subject
45
+ type: EssenceText
46
+ validate:
47
+ - presence
48
+ take_me_for_preview: true
49
+ - name: text
50
+ type: EssenceRichtext
51
+ validate:
52
+ - presence
53
+ - name: newsletter_signout_form
54
+ unique: true
55
+ contents:
56
+ - name: signed_out_text
57
+ type: EssenceRichtext
58
+ validate:
59
+ - presence
60
+ - name: disabled_text
61
+ type: EssenceRichtext
62
+ validate:
63
+ - presence
64
+ - name: newsletter_signout_mail
65
+ unique: true
66
+ contents:
67
+ - name: mail_from
68
+ type: EssenceText
69
+ validate:
70
+ - presence
71
+ - name: subject
72
+ type: EssenceText
73
+ validate:
74
+ - presence
75
+ take_me_for_preview: true
76
+ - name: text
77
+ type: EssenceRichtext
78
+ validate:
79
+ - presence