dm_event 4.2.1.5

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 (337) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +23 -0
  3. data/README.md +33 -0
  4. data/Rakefile +36 -0
  5. data/app/assets/images/dm_event/payment_logos/sofort/at/100x38.png +0 -0
  6. data/app/assets/images/dm_event/payment_logos/sofort/at/200x75.png +0 -0
  7. data/app/assets/images/dm_event/payment_logos/sofort/at/250x94.png +0 -0
  8. data/app/assets/images/dm_event/payment_logos/sofort/at/28x7.png +0 -0
  9. data/app/assets/images/dm_event/payment_logos/sofort/at/320x120.png +0 -0
  10. data/app/assets/images/dm_event/payment_logos/sofort/at/42x11.png +0 -0
  11. data/app/assets/images/dm_event/payment_logos/sofort/at/75x28.png +0 -0
  12. data/app/assets/images/dm_event/payment_logos/sofort/at/icon-32x22.png +0 -0
  13. data/app/assets/images/dm_event/payment_logos/sofort/at/icon-32x24.png +0 -0
  14. data/app/assets/images/dm_event/payment_logos/sofort/at/icon-48x32.png +0 -0
  15. data/app/assets/images/dm_event/payment_logos/sofort/at/icon-48x34.png +0 -0
  16. data/app/assets/images/dm_event/payment_logos/sofort/at/icon-64x42.png +0 -0
  17. data/app/assets/images/dm_event/payment_logos/sofort/at/icon-64x44.png +0 -0
  18. data/app/assets/images/dm_event/payment_logos/sofort/be/100x38.png +0 -0
  19. data/app/assets/images/dm_event/payment_logos/sofort/be/200x75.png +0 -0
  20. data/app/assets/images/dm_event/payment_logos/sofort/be/250x94.png +0 -0
  21. data/app/assets/images/dm_event/payment_logos/sofort/be/28x7.png +0 -0
  22. data/app/assets/images/dm_event/payment_logos/sofort/be/320x120.png +0 -0
  23. data/app/assets/images/dm_event/payment_logos/sofort/be/42x11.png +0 -0
  24. data/app/assets/images/dm_event/payment_logos/sofort/be/75x28.png +0 -0
  25. data/app/assets/images/dm_event/payment_logos/sofort/be/icon-32x22.png +0 -0
  26. data/app/assets/images/dm_event/payment_logos/sofort/be/icon-32x24.png +0 -0
  27. data/app/assets/images/dm_event/payment_logos/sofort/be/icon-48x32.png +0 -0
  28. data/app/assets/images/dm_event/payment_logos/sofort/be/icon-48x34.png +0 -0
  29. data/app/assets/images/dm_event/payment_logos/sofort/be/icon-64x42.png +0 -0
  30. data/app/assets/images/dm_event/payment_logos/sofort/be/icon-64x44.png +0 -0
  31. data/app/assets/images/dm_event/payment_logos/sofort/ch/100x38.png +0 -0
  32. data/app/assets/images/dm_event/payment_logos/sofort/ch/200x75.png +0 -0
  33. data/app/assets/images/dm_event/payment_logos/sofort/ch/250x94.png +0 -0
  34. data/app/assets/images/dm_event/payment_logos/sofort/ch/28x7.png +0 -0
  35. data/app/assets/images/dm_event/payment_logos/sofort/ch/320x120.png +0 -0
  36. data/app/assets/images/dm_event/payment_logos/sofort/ch/42x11.png +0 -0
  37. data/app/assets/images/dm_event/payment_logos/sofort/ch/75x28.png +0 -0
  38. data/app/assets/images/dm_event/payment_logos/sofort/ch/icon-32x22.png +0 -0
  39. data/app/assets/images/dm_event/payment_logos/sofort/ch/icon-32x24.png +0 -0
  40. data/app/assets/images/dm_event/payment_logos/sofort/ch/icon-48x32.png +0 -0
  41. data/app/assets/images/dm_event/payment_logos/sofort/ch/icon-48x34.png +0 -0
  42. data/app/assets/images/dm_event/payment_logos/sofort/ch/icon-64x42.png +0 -0
  43. data/app/assets/images/dm_event/payment_logos/sofort/ch/icon-64x44.png +0 -0
  44. data/app/assets/images/dm_event/payment_logos/sofort/de/100x38.png +0 -0
  45. data/app/assets/images/dm_event/payment_logos/sofort/de/200x75.png +0 -0
  46. data/app/assets/images/dm_event/payment_logos/sofort/de/250x94.png +0 -0
  47. data/app/assets/images/dm_event/payment_logos/sofort/de/28x7.png +0 -0
  48. data/app/assets/images/dm_event/payment_logos/sofort/de/320x120.png +0 -0
  49. data/app/assets/images/dm_event/payment_logos/sofort/de/42x11.png +0 -0
  50. data/app/assets/images/dm_event/payment_logos/sofort/de/75x28.png +0 -0
  51. data/app/assets/images/dm_event/payment_logos/sofort/de/icon-32x22.png +0 -0
  52. data/app/assets/images/dm_event/payment_logos/sofort/de/icon-32x24.png +0 -0
  53. data/app/assets/images/dm_event/payment_logos/sofort/de/icon-48x32.png +0 -0
  54. data/app/assets/images/dm_event/payment_logos/sofort/de/icon-48x34.png +0 -0
  55. data/app/assets/images/dm_event/payment_logos/sofort/de/icon-64x42.png +0 -0
  56. data/app/assets/images/dm_event/payment_logos/sofort/de/icon-64x44.png +0 -0
  57. data/app/assets/images/dm_event/payment_logos/sofort/es/100x38.png +0 -0
  58. data/app/assets/images/dm_event/payment_logos/sofort/es/200x75.png +0 -0
  59. data/app/assets/images/dm_event/payment_logos/sofort/es/250x94.png +0 -0
  60. data/app/assets/images/dm_event/payment_logos/sofort/es/28x7.png +0 -0
  61. data/app/assets/images/dm_event/payment_logos/sofort/es/320x120.png +0 -0
  62. data/app/assets/images/dm_event/payment_logos/sofort/es/42x11.png +0 -0
  63. data/app/assets/images/dm_event/payment_logos/sofort/es/75x28.png +0 -0
  64. data/app/assets/images/dm_event/payment_logos/sofort/es/icon-32x22.png +0 -0
  65. data/app/assets/images/dm_event/payment_logos/sofort/es/icon-32x24.png +0 -0
  66. data/app/assets/images/dm_event/payment_logos/sofort/es/icon-48x32.png +0 -0
  67. data/app/assets/images/dm_event/payment_logos/sofort/es/icon-48x34.png +0 -0
  68. data/app/assets/images/dm_event/payment_logos/sofort/es/icon-64x42.png +0 -0
  69. data/app/assets/images/dm_event/payment_logos/sofort/es/icon-64x44.png +0 -0
  70. data/app/assets/images/dm_event/payment_logos/sofort/fr/100x38.png +0 -0
  71. data/app/assets/images/dm_event/payment_logos/sofort/fr/200x75.png +0 -0
  72. data/app/assets/images/dm_event/payment_logos/sofort/fr/250x94.png +0 -0
  73. data/app/assets/images/dm_event/payment_logos/sofort/fr/28x7.png +0 -0
  74. data/app/assets/images/dm_event/payment_logos/sofort/fr/320x120.png +0 -0
  75. data/app/assets/images/dm_event/payment_logos/sofort/fr/42x11.png +0 -0
  76. data/app/assets/images/dm_event/payment_logos/sofort/fr/75x28.png +0 -0
  77. data/app/assets/images/dm_event/payment_logos/sofort/fr/icon-32x22.png +0 -0
  78. data/app/assets/images/dm_event/payment_logos/sofort/fr/icon-32x24.png +0 -0
  79. data/app/assets/images/dm_event/payment_logos/sofort/fr/icon-48x32.png +0 -0
  80. data/app/assets/images/dm_event/payment_logos/sofort/fr/icon-48x34.png +0 -0
  81. data/app/assets/images/dm_event/payment_logos/sofort/fr/icon-64x42.png +0 -0
  82. data/app/assets/images/dm_event/payment_logos/sofort/fr/icon-64x44.png +0 -0
  83. data/app/assets/images/dm_event/payment_logos/sofort/it/100x38.png +0 -0
  84. data/app/assets/images/dm_event/payment_logos/sofort/it/200x75.png +0 -0
  85. data/app/assets/images/dm_event/payment_logos/sofort/it/250x94.png +0 -0
  86. data/app/assets/images/dm_event/payment_logos/sofort/it/28x7.png +0 -0
  87. data/app/assets/images/dm_event/payment_logos/sofort/it/320x120.png +0 -0
  88. data/app/assets/images/dm_event/payment_logos/sofort/it/42x11.png +0 -0
  89. data/app/assets/images/dm_event/payment_logos/sofort/it/75x28.png +0 -0
  90. data/app/assets/images/dm_event/payment_logos/sofort/it/icon-32x22.png +0 -0
  91. data/app/assets/images/dm_event/payment_logos/sofort/it/icon-32x24.png +0 -0
  92. data/app/assets/images/dm_event/payment_logos/sofort/it/icon-48x32.png +0 -0
  93. data/app/assets/images/dm_event/payment_logos/sofort/it/icon-48x34.png +0 -0
  94. data/app/assets/images/dm_event/payment_logos/sofort/it/icon-64x42.png +0 -0
  95. data/app/assets/images/dm_event/payment_logos/sofort/it/icon-64x44.png +0 -0
  96. data/app/assets/images/dm_event/payment_logos/sofort/nl/100x38.png +0 -0
  97. data/app/assets/images/dm_event/payment_logos/sofort/nl/200x75.png +0 -0
  98. data/app/assets/images/dm_event/payment_logos/sofort/nl/250x94.png +0 -0
  99. data/app/assets/images/dm_event/payment_logos/sofort/nl/28x7.png +0 -0
  100. data/app/assets/images/dm_event/payment_logos/sofort/nl/320x120.png +0 -0
  101. data/app/assets/images/dm_event/payment_logos/sofort/nl/42x11.png +0 -0
  102. data/app/assets/images/dm_event/payment_logos/sofort/nl/75x28.png +0 -0
  103. data/app/assets/images/dm_event/payment_logos/sofort/nl/icon-32x22.png +0 -0
  104. data/app/assets/images/dm_event/payment_logos/sofort/nl/icon-32x24.png +0 -0
  105. data/app/assets/images/dm_event/payment_logos/sofort/nl/icon-48x32.png +0 -0
  106. data/app/assets/images/dm_event/payment_logos/sofort/nl/icon-48x34.png +0 -0
  107. data/app/assets/images/dm_event/payment_logos/sofort/nl/icon-64x42.png +0 -0
  108. data/app/assets/images/dm_event/payment_logos/sofort/nl/icon-64x44.png +0 -0
  109. data/app/assets/images/dm_event/payment_logos/sofort/pl/100x38.png +0 -0
  110. data/app/assets/images/dm_event/payment_logos/sofort/pl/200x75.png +0 -0
  111. data/app/assets/images/dm_event/payment_logos/sofort/pl/250x94.png +0 -0
  112. data/app/assets/images/dm_event/payment_logos/sofort/pl/28x7.png +0 -0
  113. data/app/assets/images/dm_event/payment_logos/sofort/pl/320x120.png +0 -0
  114. data/app/assets/images/dm_event/payment_logos/sofort/pl/42x11.png +0 -0
  115. data/app/assets/images/dm_event/payment_logos/sofort/pl/75x28.png +0 -0
  116. data/app/assets/images/dm_event/payment_logos/sofort/pl/icon-32x22.png +0 -0
  117. data/app/assets/images/dm_event/payment_logos/sofort/pl/icon-32x24.png +0 -0
  118. data/app/assets/images/dm_event/payment_logos/sofort/pl/icon-48x32.png +0 -0
  119. data/app/assets/images/dm_event/payment_logos/sofort/pl/icon-48x34.png +0 -0
  120. data/app/assets/images/dm_event/payment_logos/sofort/pl/icon-64x42.png +0 -0
  121. data/app/assets/images/dm_event/payment_logos/sofort/pl/icon-64x44.png +0 -0
  122. data/app/assets/images/dm_event/payment_logos/sofort/uk/100x38.png +0 -0
  123. data/app/assets/images/dm_event/payment_logos/sofort/uk/200x75.png +0 -0
  124. data/app/assets/images/dm_event/payment_logos/sofort/uk/250x94.png +0 -0
  125. data/app/assets/images/dm_event/payment_logos/sofort/uk/28x7.png +0 -0
  126. data/app/assets/images/dm_event/payment_logos/sofort/uk/320x120.png +0 -0
  127. data/app/assets/images/dm_event/payment_logos/sofort/uk/42x11.png +0 -0
  128. data/app/assets/images/dm_event/payment_logos/sofort/uk/75x28.png +0 -0
  129. data/app/assets/images/dm_event/payment_logos/sofort/uk/icon-32x22.png +0 -0
  130. data/app/assets/images/dm_event/payment_logos/sofort/uk/icon-32x24.png +0 -0
  131. data/app/assets/images/dm_event/payment_logos/sofort/uk/icon-48x32.png +0 -0
  132. data/app/assets/images/dm_event/payment_logos/sofort/uk/icon-48x34.png +0 -0
  133. data/app/assets/images/dm_event/payment_logos/sofort/uk/icon-64x42.png +0 -0
  134. data/app/assets/images/dm_event/payment_logos/sofort/uk/icon-64x44.png +0 -0
  135. data/app/assets/javascripts/dm_event/admin.js +94 -0
  136. data/app/assets/stylesheets/dm_event/admin.css +152 -0
  137. data/app/assets/stylesheets/dm_event/application.css +65 -0
  138. data/app/controllers/dm_event/admin/admin_controller.rb +13 -0
  139. data/app/controllers/dm_event/admin/registrations_controller.rb +411 -0
  140. data/app/controllers/dm_event/admin/workshop_prices_controller.rb +73 -0
  141. data/app/controllers/dm_event/admin/workshops_controller.rb +147 -0
  142. data/app/controllers/dm_event/application_controller.rb +23 -0
  143. data/app/controllers/dm_event/payments_controller.rb +83 -0
  144. data/app/controllers/dm_event/registrations_controller.rb +368 -0
  145. data/app/datatables/registration_datatable.rb +117 -0
  146. data/app/helpers/dm_event/application_helper.rb +4 -0
  147. data/app/helpers/dm_event/registrations_helper.rb +14 -0
  148. data/app/helpers/dm_event/workshops_helper.rb +41 -0
  149. data/app/mailers/payment_reminder_mailer.rb +25 -0
  150. data/app/mailers/registration_notify_mailer.rb +31 -0
  151. data/app/models/dm_event/concerns/ability.rb +38 -0
  152. data/app/models/dm_event/concerns/registration_state_email.rb +80 -0
  153. data/app/models/dm_event/concerns/registration_state_machine.rb +218 -0
  154. data/app/models/dm_event/concerns/user_profile.rb +20 -0
  155. data/app/models/dm_event/model_decorators.rb +6 -0
  156. data/app/models/dm_event/permitted_params.rb +35 -0
  157. data/app/models/payment.rb +48 -0
  158. data/app/models/registration.rb +297 -0
  159. data/app/models/workshop.rb +247 -0
  160. data/app/models/workshop_price.rb +118 -0
  161. data/app/presenters/event_common_presenter.rb +31 -0
  162. data/app/presenters/registration_presenter.rb +34 -0
  163. data/app/presenters/workshop_presenter.rb +22 -0
  164. data/app/views/dm_event/admin/registrations/_form.html.erb +297 -0
  165. data/app/views/dm_event/admin/registrations/action_state.js.erb +1 -0
  166. data/app/views/dm_event/admin/registrations/edit.html.erb +1 -0
  167. data/app/views/dm_event/admin/registrations/index.html.erb +0 -0
  168. data/app/views/dm_event/admin/workshop_prices/_form.html.erb +62 -0
  169. data/app/views/dm_event/admin/workshop_prices/edit.html.erb +2 -0
  170. data/app/views/dm_event/admin/workshop_prices/index.html.erb +31 -0
  171. data/app/views/dm_event/admin/workshop_prices/new.html.erb +2 -0
  172. data/app/views/dm_event/admin/workshops/_form.html.erb +61 -0
  173. data/app/views/dm_event/admin/workshops/_header_menu.html.erb +21 -0
  174. data/app/views/dm_event/admin/workshops/_registration_stats.html.erb +58 -0
  175. data/app/views/dm_event/admin/workshops/additional_configuration.html.erb +47 -0
  176. data/app/views/dm_event/admin/workshops/edit.html.erb +2 -0
  177. data/app/views/dm_event/admin/workshops/edit_system_email.html.erb +75 -0
  178. data/app/views/dm_event/admin/workshops/financials.html.erb +179 -0
  179. data/app/views/dm_event/admin/workshops/index.html.erb +100 -0
  180. data/app/views/dm_event/admin/workshops/lost_users.html.erb +44 -0
  181. data/app/views/dm_event/admin/workshops/new.html.erb +2 -0
  182. data/app/views/dm_event/admin/workshops/show.html.erb +47 -0
  183. data/app/views/dm_event/admin/workshops/user_outstanding_balances.html.erb +29 -0
  184. data/app/views/dm_event/liquid_tags/_funding_project_status.html.erb +27 -0
  185. data/app/views/dm_event/payments/_registrations_paypal_standard.html.erb +23 -0
  186. data/app/views/dm_event/payments/_registrations_sofort.html.erb +18 -0
  187. data/app/views/dm_event/registrations/_section_address.html.erb +30 -0
  188. data/app/views/dm_event/registrations/_section_custom_fields.html.erb +7 -0
  189. data/app/views/dm_event/registrations/_section_prices.html.erb +33 -0
  190. data/app/views/dm_event/registrations/_workshop_price.html.erb +18 -0
  191. data/app/views/dm_event/registrations/choose_payment.html.erb +5 -0
  192. data/app/views/dm_event/registrations/closed.html.erb +14 -0
  193. data/app/views/dm_event/registrations/new.html.erb +30 -0
  194. data/app/views/dm_event/registrations/success.html.erb +15 -0
  195. data/app/views/layouts/email_templates/dm_event_email_layout.html.erb +318 -0
  196. data/app/views/layouts/email_templates/dm_event_email_layout.text.erb +1 -0
  197. data/app/views/layouts/email_templates/dm_event_payment_reminder.html.erb +22 -0
  198. data/app/views/layouts/email_templates/dm_event_payment_reminder.text.erb +19 -0
  199. data/app/views/layouts/email_templates/dm_event_registration_notify.html.erb +21 -0
  200. data/app/views/layouts/email_templates/dm_event_registration_notify.text.erb +13 -0
  201. data/config/initializers/dm_event.rb +1 -0
  202. data/config/initializers/liquid_init.rb +2 -0
  203. data/config/locales/ems.cs.yml +51 -0
  204. data/config/locales/ems.de.yml +51 -0
  205. data/config/locales/ems.en.yml +51 -0
  206. data/config/locales/ems.fi.yml +51 -0
  207. data/config/locales/ems.ja.yml +51 -0
  208. data/config/routes.rb +40 -0
  209. data/db/migrate/20130510155617_create_events.rb +98 -0
  210. data/db/migrate/20130516124327_add_locale_to_registration.rb +5 -0
  211. data/db/migrate/20130516204454_add_user_profile_to_registration.rb +11 -0
  212. data/db/migrate/20130518092324_add_require_address.rb +7 -0
  213. data/db/migrate/20130609145812_add_workshop_published.rb +5 -0
  214. data/db/migrate/20130624134506_add_amount_currency.rb +16 -0
  215. data/db/migrate/20130703131515_add_workshop_currency.rb +5 -0
  216. data/db/migrate/20130913083529_add_event_funding_type.rb +6 -0
  217. data/db/migrate/20130914105736_add_enable_payments.rb +5 -0
  218. data/db/migrate/20130916160033_add_sidebar_to_workshop.rb +5 -0
  219. data/db/migrate/20130917161700_add_show_address.rb +5 -0
  220. data/db/migrate/20131116180719_add_default_funding_goal.rb +8 -0
  221. data/db/migrate/20131127165445_add_payment_reminder.rb +5 -0
  222. data/db/migrate/20140122204702_add_event_image.rb +5 -0
  223. data/db/migrate/20140523165342_add_workshop_summary.rb +5 -0
  224. data/db/migrate/20140605052208_add_uuid_to_registration.rb +10 -0
  225. data/db/migrate/20140707152124_add_registration_comment_count.rb +5 -0
  226. data/db/migrate/20140708142312_add_payment_comment.rb +20 -0
  227. data/db/migrate/20150709125105_add_payment_reminder_history.rb +16 -0
  228. data/db/migrate/20160810081542_add_bcc_contact_email.rb +5 -0
  229. data/db/migrate/20160821150120_index_foreign_keys_in_ems_registrations.rb +9 -0
  230. data/db/migrate/20160821150121_index_foreign_keys_in_ems_workshop_price_translations.rb +5 -0
  231. data/db/migrate/20160821150122_index_foreign_keys_in_ems_workshop_prices.rb +6 -0
  232. data/db/migrate/20160821150123_index_foreign_keys_in_ems_workshop_translations.rb +5 -0
  233. data/db/migrate/20160821150124_index_foreign_keys_in_ems_workshops.rb +6 -0
  234. data/lib/dm_event/engine.rb +20 -0
  235. data/lib/dm_event/liquid/tags/funding_project_status.rb +55 -0
  236. data/lib/dm_event.rb +4 -0
  237. data/lib/tasks/dm_event_tasks.rake +4 -0
  238. data/spec/controllers/registrations_controller_spec.rb +152 -0
  239. data/spec/dummy/README.rdoc +28 -0
  240. data/spec/dummy/Rakefile +6 -0
  241. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  242. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  243. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  244. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  245. data/spec/dummy/app/models/ability.rb +10 -0
  246. data/spec/dummy/app/models/user.rb +6 -0
  247. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  248. data/spec/dummy/bin/bundle +3 -0
  249. data/spec/dummy/bin/rails +4 -0
  250. data/spec/dummy/bin/rake +4 -0
  251. data/spec/dummy/config/application.rb +26 -0
  252. data/spec/dummy/config/boot.rb +5 -0
  253. data/spec/dummy/config/database.yml +25 -0
  254. data/spec/dummy/config/environment.rb +5 -0
  255. data/spec/dummy/config/environments/development.rb +37 -0
  256. data/spec/dummy/config/environments/production.rb +82 -0
  257. data/spec/dummy/config/environments/test.rb +39 -0
  258. data/spec/dummy/config/initializers/assets.rb +8 -0
  259. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  260. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  261. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  262. data/spec/dummy/config/initializers/inflections.rb +16 -0
  263. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  264. data/spec/dummy/config/initializers/session_store.rb +3 -0
  265. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  266. data/spec/dummy/config/locales/en.yml +23 -0
  267. data/spec/dummy/config/routes.rb +11 -0
  268. data/spec/dummy/config/secrets.yml +22 -0
  269. data/spec/dummy/config.ru +4 -0
  270. data/spec/dummy/db/development.sqlite3 +0 -0
  271. data/spec/dummy/db/migrate/20141114170927_add_globalize_countries.dm_core.rb +50 -0
  272. data/spec/dummy/db/migrate/20141114170928_devise_create_users.dm_core.rb +46 -0
  273. data/spec/dummy/db/migrate/20141114170929_add_user_fields.dm_core.rb +14 -0
  274. data/spec/dummy/db/migrate/20141114170930_rolify_create_roles.dm_core.rb +20 -0
  275. data/spec/dummy/db/migrate/20141114170931_add_last_access.dm_core.rb +10 -0
  276. data/spec/dummy/db/migrate/20141114170932_create_versions.dm_core.rb +19 -0
  277. data/spec/dummy/db/migrate/20141114170933_add_object_changes_column_to_versions.dm_core.rb +12 -0
  278. data/spec/dummy/db/migrate/20141114170934_create_dm_core_accounts.dm_core.rb +13 -0
  279. data/spec/dummy/db/migrate/20141114170935_add_account_to_users.dm_core.rb +9 -0
  280. data/spec/dummy/db/migrate/20141114170936_create_preferences.dm_core.rb +13 -0
  281. data/spec/dummy/db/migrate/20141114170937_create_comments.dm_core.rb +22 -0
  282. data/spec/dummy/db/migrate/20141114170938_add_activity.dm_core.rb +21 -0
  283. data/spec/dummy/db/migrate/20141114170939_add_type_to_comments.dm_core.rb +9 -0
  284. data/spec/dummy/db/migrate/20141114170940_add_category.dm_core.rb +28 -0
  285. data/spec/dummy/db/migrate/20141114170941_create_email_table.dm_core.rb +26 -0
  286. data/spec/dummy/db/migrate/20141114170942_add_user_profile.dm_core.rb +46 -0
  287. data/spec/dummy/db/migrate/20141114170943_add_profile_email.dm_core.rb +14 -0
  288. data/spec/dummy/db/migrate/20141114170944_create_payment_history.dm_core.rb +37 -0
  289. data/spec/dummy/db/migrate/20141114170945_change_anchor_field.dm_core.rb +10 -0
  290. data/spec/dummy/db/migrate/20141114170946_create_user_site_profile.dm_core.rb +27 -0
  291. data/spec/dummy/db/migrate/20141114170947_add_avatar.dm_core.rb +12 -0
  292. data/spec/dummy/db/migrate/20141114170948_add_notify_to_payment_history.dm_core.rb +8 -0
  293. data/spec/dummy/db/migrate/20141114170949_acts_as_votable_migration.dm_core.rb +28 -0
  294. data/spec/dummy/db/migrate/20141114170950_add_user_site_profile_uuid.dm_core.rb +19 -0
  295. data/spec/dummy/db/migrate/20141114170951_add_invoice_id.dm_core.rb +7 -0
  296. data/spec/dummy/db/migrate/20141114170952_acts_as_follower_migration.dm_core.rb +18 -0
  297. data/spec/dummy/db/migrate/20141114170953_rename_invoice_id.dm_core.rb +12 -0
  298. data/spec/dummy/db/migrate/20141114170954_add_core_addresses.dm_core.rb +18 -0
  299. data/spec/dummy/db/migrate/20141114170955_papertrail_increase_column.dm_core.rb +9 -0
  300. data/spec/dummy/db/migrate/20141114170956_acts_as_taggable_on_migration.dm_core.rb +32 -0
  301. data/spec/dummy/db/migrate/20141114170957_add_missing_unique_indices.dm_core.rb +23 -0
  302. data/spec/dummy/db/migrate/20141114170958_add_taggings_counter_cache_to_tags.dm_core.rb +16 -0
  303. data/spec/dummy/db/migrate/20141114170959_create_custom_fields.dm_core.rb +40 -0
  304. data/spec/dummy/db/migrate/20141114170960_add_missing_taggable_index.dm_core.rb +11 -0
  305. data/spec/dummy/db/migrate/20141119103740_create_cms.dm_cms.rb +92 -0
  306. data/spec/dummy/db/migrate/20141119103741_add_account_to_cms.dm_cms.rb +11 -0
  307. data/spec/dummy/db/migrate/20141119103742_create_blog.dm_cms.rb +62 -0
  308. data/spec/dummy/db/migrate/20141119103743_add_notification_sent.dm_cms.rb +6 -0
  309. data/spec/dummy/db/migrate/20141119103744_add_blog_comment.dm_cms.rb +8 -0
  310. data/spec/dummy/db/migrate/20141119103745_add_blog_image.dm_cms.rb +6 -0
  311. data/spec/dummy/db/migrate/20141119103746_rename_snippet_slug.dm_cms.rb +14 -0
  312. data/spec/dummy/db/migrate/20141119103747_add_requires_subscription_blog.dm_cms.rb +8 -0
  313. data/spec/dummy/db/migrate/20141119103748_add_pages_ranked_model.dm_cms.rb +23 -0
  314. data/spec/dummy/db/migrate/20141119103749_add_blog_owner.dm_cms.rb +7 -0
  315. data/spec/dummy/db/migrate/20141119103750_create_media_files.dm_cms.rb +30 -0
  316. data/spec/dummy/db/migrate/20141119103751_add_cmspage_summary.dm_cms.rb +7 -0
  317. data/spec/dummy/db/migrate/20141119103752_add_blog_image_email_header.dm_cms.rb +6 -0
  318. data/spec/dummy/db/migrate/20141119103753_add_header_image.dm_cms.rb +10 -0
  319. data/spec/dummy/db/migrate/20160128154135_add_favored_locale.dm_core.rb +17 -0
  320. data/spec/dummy/db/migrate/20160128154136_update_papertrail_v4.dm_core.rb +41 -0
  321. data/spec/dummy/db/schema.rb +677 -0
  322. data/spec/dummy/public/404.html +67 -0
  323. data/spec/dummy/public/422.html +67 -0
  324. data/spec/dummy/public/500.html +66 -0
  325. data/spec/dummy/public/favicon.ico +0 -0
  326. data/spec/factories/account_factory.rb +7 -0
  327. data/spec/factories/registration_factory.rb +13 -0
  328. data/spec/factories/workshop_factory.rb +25 -0
  329. data/spec/factories/workshop_price_factory.rb +19 -0
  330. data/spec/models/registration_spec.rb +83 -0
  331. data/spec/models/workshop_spec.rb +26 -0
  332. data/spec/rails_helper.rb +70 -0
  333. data/spec/spec_helper.rb +85 -0
  334. data/spec/support/accounts.rb +17 -0
  335. data/spec/support/devise.rb +44 -0
  336. data/spec/support/fix_locale.rb +57 -0
  337. metadata +520 -0
@@ -0,0 +1,80 @@
1
+ # Extends the Registration model with a state machine
2
+ #------------------------------------------------------------------------------
3
+ module DmEvent
4
+ module Concerns
5
+ module RegistrationStateEmail
6
+ extend ActiveSupport::Concern
7
+ include DmUtilities::DateHelper
8
+
9
+ # 'included do' causes the included code to be evaluated in the
10
+ # conext where it is included (post.rb), rather than be
11
+ # executed in the module's context (blorgh/concerns/models/post).
12
+ #------------------------------------------------------------------------------
13
+ included do
14
+
15
+ #------------------------------------------------------------------------------
16
+ def to_liquid
17
+ result = {
18
+ 'price' => (workshop_price.nil? ? '' : workshop_price.price_formatted),
19
+ 'receipt_code' => receipt_code.to_s,
20
+ 'price_description' => "#{workshop_price.price_description unless workshop_price.nil?}",
21
+ 'title' => workshop.title,
22
+ 'fullname' => user_profile.full_name,
23
+ 'payment_url' => self.payment_url,
24
+ 'balance' => self.balance_owed.format,
25
+ 'start_date' => format_date(workshop.starting_on, true),
26
+ 'end_date' => format_date(workshop.ending_on, true),
27
+ 'start_time' => format_time(workshop.starting_on),
28
+ 'end_time' => format_time(workshop.ending_on),
29
+ 'date_range' => format_date_range(workshop.starting_on, workshop.ending_on)
30
+ }
31
+
32
+ # TODO This is a security hole. Any customer field data needs to be sanitized
33
+ # custom_fields.each do | x |
34
+ # result[x.column_name] = x.data
35
+ # end
36
+
37
+ return result
38
+ end
39
+
40
+ # Send an email for state notification. if send_email is false, just return
41
+ # the content of the email
42
+ #------------------------------------------------------------------------------
43
+ def email_state_notification(state = aasm.current_state.to_s, send_email = true)
44
+ I18n.with_locale(registered_locale) do
45
+ system_email = workshop.send("#{state}_email")
46
+ if system_email
47
+ receipt_content = compile_email(state, system_email)
48
+ if send_email
49
+ return RegistrationNotifyMailer.registration_notify(self, receipt_content[:content], receipt_content[:substitutions]).deliver_now
50
+ else
51
+ return receipt_content[:content]
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ # Compile the email values
58
+ #------------------------------------------------------------------------------
59
+ def compile_email(state, system_email)
60
+ substitutions = {
61
+ 'state' => state.to_s,
62
+ 'event' => self.to_liquid
63
+ }
64
+ substitutions['payment_details'] = Liquid::Template.parse(workshop_price.payment_details).render(substitutions) unless workshop_price.try(:payment_details).blank?
65
+ substitutions['subject'] = Liquid::Template.parse(system_email.subject).render(substitutions)
66
+
67
+ template = Liquid::Template.parse(system_email.body)
68
+ content = template.render(substitutions)
69
+ return {:content => content, :substitutions => substitutions}
70
+ end
71
+
72
+ end
73
+
74
+ #------------------------------------------------------------------------------
75
+ module ClassMethods
76
+ end
77
+
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,218 @@
1
+ # Extends the Registration model with a state machine
2
+ #------------------------------------------------------------------------------
3
+ module DmEvent
4
+ module Concerns
5
+ module RegistrationStateMachine
6
+ extend ActiveSupport::Concern
7
+
8
+ # 'included do' causes the included code to be evaluated in the
9
+ # conext where it is included (post.rb), rather than be
10
+ # executed in the module's context (blorgh/concerns/models/post).
11
+ #------------------------------------------------------------------------------
12
+ included do
13
+ include AASM
14
+
15
+ #--- define how the state machine works
16
+ aasm do
17
+ state :open, :initial => true, :after_enter => Proc.new { |o| o.start! }
18
+ state :pending, :after_enter => :state_pending
19
+ state :reviewing, :after_enter => :state_reviewing
20
+ state :accepted, :after_enter => :state_acceptance
21
+ state :rejected, :after_enter => :state_rejection
22
+ state :paid, :after_enter => :state_paid
23
+ state :waitlisted, :after_enter => :state_waitlisted
24
+ state :canceled, :after_enter => :state_canceled
25
+ state :refunded, :after_enter => :state_refunded
26
+ state :noshow, :after_enter => :state_noshow
27
+
28
+ #------------------------------------------------------------------------------
29
+ event :start do
30
+ transitions :from => :open, :to => :waitlisted, :guard => Proc.new {|o| o.workshop.waitlisting?}
31
+ transitions :from => :open, :to => :pending, :guard => Proc.new {|o| o.workshop.require_review?}
32
+ transitions :from => :open, :to => :accepted
33
+ end
34
+
35
+ #------------------------------------------------------------------------------
36
+ event :review do
37
+ transitions :from => :pending, :to => :reviewing
38
+ transitions :from => :accepted, :to => :reviewing
39
+ transitions :from => :rejected, :to => :reviewing
40
+ transitions :from => :waitlisted, :to => :reviewing
41
+ transitions :from => :canceled, :to => :reviewing
42
+ transitions :from => :refunded, :to => :reviewing
43
+ transitions :from => :noshow, :to => :reviewing
44
+ end
45
+
46
+ #------------------------------------------------------------------------------
47
+ event :accept do
48
+ transitions :from => :pending, :to => :accepted
49
+ transitions :from => :paid, :to => :accepted
50
+ transitions :from => :reviewing, :to => :accepted
51
+ transitions :from => :rejected, :to => :accepted
52
+ transitions :from => :waitlisted, :to => :accepted
53
+ transitions :from => :canceled, :to => :accepted
54
+ transitions :from => :refunded, :to => :accepted
55
+ transitions :from => :noshow, :to => :accepted
56
+ end
57
+
58
+ #------------------------------------------------------------------------------
59
+ event :paid do
60
+ transitions :from => :pending, :to => :paid
61
+ transitions :from => :reviewing, :to => :paid
62
+ transitions :from => :accepted, :to => :paid
63
+ transitions :from => :paid, :to => :paid
64
+ transitions :from => :rejected, :to => :paid
65
+ transitions :from => :refunded, :to => :paid
66
+ transitions :from => :noshow, :to => :paid
67
+ transitions :from => :waitlisted, :to => :paid
68
+ end
69
+
70
+ #------------------------------------------------------------------------------
71
+ event :refund do
72
+ transitions :from => :paid, :to => :refunded
73
+ transitions :from => :canceled, :to => :refunded
74
+ transitions :from => :accepted, :to => :refunded
75
+ transitions :from => :pending, :to => :refunded
76
+ transitions :from => :reviewing, :to => :refunded
77
+ transitions :from => :waitlisted, :to => :refunded
78
+ end
79
+
80
+ #------------------------------------------------------------------------------
81
+ event :reject do
82
+ transitions :from => :pending, :to => :rejected
83
+ transitions :from => :reviewing, :to => :rejected
84
+ transitions :from => :waitlisted, :to => :rejected
85
+ transitions :from => :canceled, :to => :rejected
86
+ end
87
+
88
+ #------------------------------------------------------------------------------
89
+ event :cancellation do
90
+ transitions :from => :accepted, :to => :canceled
91
+ transitions :from => :pending, :to => :canceled
92
+ transitions :from => :reviewing, :to => :canceled
93
+ transitions :from => :paid, :to => :canceled
94
+ transitions :from => :waitlisted, :to => :canceled
95
+ transitions :from => :rejected, :to => :canceled
96
+ transitions :from => :noshow, :to => :canceled
97
+ end
98
+
99
+ #------------------------------------------------------------------------------
100
+ event :waitlist do
101
+ transitions :from => :pending, :to => :waitlisted
102
+ transitions :from => :reviewing, :to => :waitlisted
103
+ transitions :from => :rejected, :to => :waitlisted
104
+ transitions :from => :accepted, :to => :waitlisted
105
+ transitions :from => :canceled, :to => :waitlisted
106
+ transitions :from => :paid, :to => :waitlisted
107
+ end
108
+
109
+ #------------------------------------------------------------------------------
110
+ event :noshow do
111
+ transitions :from => :pending, :to => :noshow
112
+ transitions :from => :reviewing, :to => :noshow
113
+ transitions :from => :accepted, :to => :noshow
114
+ transitions :from => :rejected, :to => :noshow
115
+ transitions :from => :paid, :to => :noshow
116
+ transitions :from => :canceled, :to => :noshow
117
+ transitions :from => :waitlisted, :to => :noshow
118
+ transitions :from => :refunded, :to => :noshow
119
+ end
120
+
121
+ #------------------------------------------------------------------------------
122
+ event :pending do
123
+ transitions :from => :reviewing, :to => :pending
124
+ transitions :from => :waitlisted, :to => :pending
125
+ end
126
+
127
+ end
128
+
129
+ #------------------------------------------------------------------------------
130
+ def current_state
131
+ aasm.current_state
132
+ end
133
+
134
+ # send the email if it's defined
135
+ #------------------------------------------------------------------------------
136
+ def state_pending
137
+ update_state_date
138
+ email_state_notification(:pending)
139
+ end
140
+
141
+ #------------------------------------------------------------------------------
142
+ def state_reviewing
143
+ update_state_date
144
+ end
145
+
146
+ # send the email if it's defined
147
+ #------------------------------------------------------------------------------
148
+ def state_acceptance
149
+ update_state_date
150
+ email_state_notification(:accepted) unless @suppress_transition_email
151
+ end
152
+
153
+ # send the email if it's defined
154
+ #------------------------------------------------------------------------------
155
+ def state_rejection
156
+ update_state_date
157
+ email_state_notification(:rejected)
158
+ end
159
+
160
+ # send the email if it's defined
161
+ #------------------------------------------------------------------------------
162
+ def state_paid
163
+ update_state_date
164
+ email_state_notification(:paid)
165
+ end
166
+
167
+ # send the email if it's defined
168
+ #------------------------------------------------------------------------------
169
+ def state_waitlisted
170
+ update_state_date
171
+ email_state_notification(:waitlisted)
172
+ end
173
+
174
+ #------------------------------------------------------------------------------
175
+ def state_canceled
176
+ update_state_date
177
+ end
178
+
179
+ #------------------------------------------------------------------------------
180
+ def state_refunded
181
+ update_state_date
182
+ end
183
+
184
+ #------------------------------------------------------------------------------
185
+ def state_noshow
186
+ update_state_date
187
+ end
188
+
189
+ #------------------------------------------------------------------------------
190
+ def update_state_date
191
+ update_attribute(:process_changed_on, Time.now)
192
+ end
193
+
194
+ #------------------------------------------------------------------------------
195
+ def attending?
196
+ aasm_state == 'accepted' || aasm_state == 'paid'
197
+ end
198
+
199
+ # return true if they have registered
200
+ #------------------------------------------------------------------------------
201
+ def registered?
202
+ aasm_state == 'pending' || aasm_state == 'waitlisted' || attending?
203
+ end
204
+
205
+ # don't send a the notification email during a state transition
206
+ #------------------------------------------------------------------------------
207
+ def suppress_transition_email
208
+ @suppress_transition_email = true
209
+ end
210
+ end
211
+
212
+ #------------------------------------------------------------------------------
213
+ module ClassMethods
214
+ end
215
+
216
+ end
217
+ end
218
+ end
@@ -0,0 +1,20 @@
1
+ # Extends the User model with hooks for the Event engine
2
+ #------------------------------------------------------------------------------
3
+ module DmEvent
4
+ module Concerns
5
+ module UserProfile
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+
10
+ has_many :registrations
11
+
12
+ end
13
+
14
+ #------------------------------------------------------------------------------
15
+ module ClassMethods
16
+ end
17
+
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,6 @@
1
+ # Decorate any models
2
+ # Chose to use this method for now, instead of creating a decorator folder and
3
+ # eager-loading it. Prefer to keep the logic in the model folder.
4
+ #------------------------------------------------------------------------------
5
+
6
+ UserProfile.send(:include, DmEvent::Concerns::UserProfile)
@@ -0,0 +1,35 @@
1
+ module DmEvent
2
+ module PermittedParams
3
+
4
+ #------------------------------------------------------------------------------
5
+ def workshop_params
6
+ params.require(:workshop).permit! if can? :manage_events, :all
7
+ end
8
+
9
+ #------------------------------------------------------------------------------
10
+ def workshop_price_params
11
+ params.require(:workshop_price).permit! if can? :manage_events, :all
12
+ end
13
+
14
+ #------------------------------------------------------------------------------
15
+ def registration_params
16
+ return nil if params[:registration].nil? || params[:registration].empty?
17
+ if can? :manage_events, :all
18
+ params.require(:registration).permit!
19
+ else
20
+ # nested attributes: because field_data can be either a single value or an array of values,
21
+ # we include it twice in the permit, once as a normal param, and again as a param with data.
22
+ # sample data:
23
+ # {"workshop_price_id"=>"72", "custom_fields_attributes"=>{"0"=>{"field_data"=>"234", "custom_field_def_id"=>"8"},
24
+ # "1"=>{"field_data"=>["eee", ""], "custom_field_def_id"=>"16"}}}
25
+ params.require(:registration).permit(:workshop_price_id, custom_fields_attributes: [:field_data, {:field_data => []}, :custom_field_def_id])
26
+ end
27
+ end
28
+
29
+ #------------------------------------------------------------------------------
30
+ def system_email_params
31
+ params.require(:system_email).permit! if can? :manage_events, :all
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,48 @@
1
+ # Handle payment related logic
2
+ #------------------------------------------------------------------------------
3
+ class Payment
4
+ include ActiveMerchant::Billing::Integrations
5
+
6
+ # Handle Payment notification logic
7
+ #------------------------------------------------------------------------------
8
+ def self.event_payment_ipn(notify, payment_method = '')
9
+ Rails.logger.error('===> Enter: Payment.event_payment_ipn')
10
+ Rails.logger.error(notify.inspect)
11
+ registration = Registration.find_by_receipt_code(notify.item_id)
12
+
13
+ if notify.acknowledge
14
+ if registration
15
+ Rails.logger.error(registration.inspect)
16
+ payment_history = PaymentHistory.find_by_transaction_id(notify.transaction_id) ||
17
+ registration.manual_payment( nil,
18
+ notify.amount.to_f.to_s,
19
+ notify.currency,
20
+ nil,
21
+ payment_method: payment_method,
22
+ payment_date: notify.received_at,
23
+ notify_data: notify,
24
+ transaction_id: notify.transaction_id,
25
+ status: notify.status
26
+ )
27
+ Rails.logger.error(payment_history.inspect)
28
+ begin
29
+ if notify.complete?
30
+ payment_history.status = notify.status
31
+ else
32
+ # TODO need to handle refunding, etc
33
+ Rails.logger.error("Failed to verify #{payment_method} payment notification, please investigate")
34
+ end
35
+ rescue => e
36
+ payment_history.status = 'Error'
37
+ raise
38
+ ensure
39
+ payment_history.save
40
+ end
41
+ else
42
+ #--- [todo] a linked registration was not found. Should be stored in payment table anyway
43
+ Rails.logger.error(" > Error: Registration was not found: #{notify.item_id}")
44
+ end
45
+ end
46
+ end
47
+
48
+ end