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,368 @@
1
+ ActionView::Base.send(:include, ActiveMerchant::Billing::Integrations::ActionViewHelper)
2
+
3
+ class DmEvent::RegistrationsController < DmEvent::ApplicationController
4
+ include DmEvent::PermittedParams
5
+ include ActiveMerchant::Billing::Integrations
6
+ include DmCore::UrlHelper
7
+ include DmCore::LiquidHelper
8
+
9
+ protect_from_forgery :except => [:paypal_ipn, :sofort_ipn]
10
+
11
+ helper DmEvent::WorkshopsHelper
12
+ helper DmEvent::RegistrationsHelper
13
+ layout 'layouts/event_templates/register'
14
+
15
+ before_filter :workshop_lookup, except: [:success]
16
+
17
+ #------------------------------------------------------------------------------
18
+ def new
19
+ redirect_to main_app.root_url and return if @workshop.nil?
20
+
21
+ if !@workshop.registration_closed? || is_admin?
22
+ @registration = @workshop.registrations.build
23
+ @registration.user_profile = current_user ? current_user.user_profile : UserProfile.new
24
+
25
+ if @workshop.require_address && !@registration.user_profile.address_valid?
26
+ #--- address is required and there are missing fields in the profile
27
+ @registration.user_profile.address_required = true
28
+ end
29
+ @registration.user_profile.userless_registration = true if current_user.nil? && !@workshop.require_account
30
+
31
+ set_meta description: @workshop.summary, "og:description" => sanitize_text(markdown(@workshop.summary, safe: false))
32
+ set_meta "og:image" => site_asset_media_url(@workshop.image) if @workshop.image.present?
33
+ else
34
+ render action: :closed
35
+ end
36
+ end
37
+
38
+ #------------------------------------------------------------------------------
39
+ def create
40
+ redirect_to(action: :new) and return if @workshop.require_account && current_user.nil?
41
+
42
+ profile_params = params[:registration].delete("user_profile_attributes") if params[:registration]
43
+ profile_params.delete(:id) if profile_params
44
+
45
+ @registration = @workshop.registrations.new(registration_params)
46
+ @registration.registered_locale = I18n.locale
47
+ @registration.user_profile = current_user ? current_user.user_profile : UserProfile.new
48
+ @registration.user_profile.assign_attributes(user_profile_direct_params(profile_params)) unless profile_params.blank?
49
+
50
+ if @registration.save
51
+ if @workshop.payments_enabled? && !@workshop.require_review? && @registration.balance_owed.positive?
52
+ redirect_to register_choose_payment_url(@registration.uuid)
53
+ else
54
+ redirect_to register_success_url(@registration.uuid)
55
+ end
56
+ else
57
+ render action: :new
58
+ end
59
+ end
60
+
61
+ # Only allow to proceed with payment if the registration is still in pending
62
+ #------------------------------------------------------------------------------
63
+ def choose_payment
64
+ @registration = Registration.find_by_uuid(params[:uuid])
65
+ @workshop = @registration.workshop if @registration
66
+ flash[:alert] = I18n.t('core.resource_invalid')
67
+ redirect_to main_app.root_url and return if @registration.nil? || !@registration.accepted?
68
+
69
+ if @workshop.require_account
70
+ raise Account::LoginRequired.new(I18n.t('core.login_required')) if current_user.nil?
71
+ if @registration.user_profile.user != current_user && !is_admin?
72
+ flash[:alert] = I18n.t('core.resource_invalid')
73
+ redirect_to main_app.root_url and return
74
+ end
75
+ end
76
+ end
77
+
78
+ # Success page for a registration. Look up the uuid and display success.
79
+ # Can do this many times - if the user doesn't own the registration, then kick
80
+ # them out.
81
+ #------------------------------------------------------------------------------
82
+ def success
83
+ @registration = Registration.find_by_uuid(params[:uuid])
84
+ if @registration.nil? || @registration.user_profile.user != current_user
85
+ #--- not logged in or not the users registration (for )
86
+ flash[:alert] = I18n.t('core.resource_invalid')
87
+ redirect_to main_app.root_url and return
88
+ end
89
+ @workshop = @registration.workshop if @registration
90
+ @receipt_content = @registration.email_state_notification(@registration.current_state, false) || ""
91
+ end
92
+
93
+ private
94
+
95
+ #------------------------------------------------------------------------------
96
+ def workshop_lookup
97
+ @workshop = Workshop.find_by_slug(params[:id])
98
+ end
99
+ end
100
+
101
+
102
+ =begin
103
+ helper 'dm_event/event_registrations'
104
+ helper 'dm_event/custom_fields'
105
+
106
+ before_filter :login_required, :only => [:show_registrations]
107
+ before_filter :ssl_required
108
+
109
+ layout :use_layout
110
+
111
+ # TODO GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
112
+ #verify :method => :post, :only => [ :confirm, :verify_payment ],
113
+ # :redirect_to => { :action => :index }
114
+
115
+ private
116
+ #------------------------------------------------------------------------------
117
+ def use_layout
118
+ "#{account_layouts}/#{Hanuman::Application.config.event_registration_layout}"
119
+ end
120
+
121
+ public
122
+ #-----------------------------------------------------------------------
123
+ def index
124
+ #--- clear out any session data for this registration
125
+ session[:event_registration] = nil
126
+ redirect_to '/'
127
+ end
128
+
129
+ # :id => the workshop id we're registering for
130
+ #-----------------------------------------------------------------------
131
+ def register
132
+ redirect_to :action => 'index' and return if params[:id] == nil
133
+ @workshop = EventWorkshop.find_by_id(params[:id])
134
+ redirect_to :action => 'index' and return if @workshop == nil
135
+ redirect_to :action => 'index' and return unless @workshop.valid_invitation?(params[:code])
136
+
137
+ #--- allow an admin to see registration form
138
+ if !@workshop.workshop_closed or permit?("#{SystemRoles::Moderator} on :workshop or #{SystemRoles::Admin} on Event or #{SystemRoles::Admin} on Student or #{SystemRoles::System}")
139
+ if @workshop.require_account
140
+ unless logged_in?
141
+ flash[:special_message] = nls(:event_require_account, :title => @workshop.title, :link => register_account_url)
142
+ login_required
143
+ return
144
+ end
145
+ end
146
+
147
+ #--- if we're an admin, then you can register another student for this event, using information from a previous registration
148
+ if !params[:r_id].blank? and permit?("#{SystemRoles::Moderator} on :workshop or #{SystemRoles::Admin} on Event or #{SystemRoles::Admin} on Student or #{SystemRoles::System}")
149
+ old_registration = EventRegistration.find(params[:r_id])
150
+ @register_user = old_registration.student.user
151
+ @event_registration = EventRegistration.new_registration_from_old(@workshop.id, old_registration)
152
+ elsif !params[:s_id].blank? and permit?("#{SystemRoles::Moderator} on :workshop or #{SystemRoles::Admin} on Event or #{SystemRoles::Admin} on Student or #{SystemRoles::System}")
153
+ @register_user = Student.find(params[:s_id]).user
154
+ @event_registration = EventRegistration.new(:event_workshop_id => @workshop.id, :country_id => @workshop.country_id)
155
+ else
156
+ @register_user = current_user
157
+ @event_registration = EventRegistration.new(:event_workshop_id => @workshop.id, :country_id => @workshop.country_id)
158
+ end
159
+
160
+ @use_login_info = @workshop.require_account || (!@register_user.nil? && !params['no_login'])
161
+
162
+ unless put_or_post?
163
+ #--- build up the custom field objects
164
+ @workshop.custom_field_defs.each do |c|
165
+ @event_registration.custom_fields.build(:custom_field_def_id => c.id)
166
+ end
167
+ else
168
+ #--- TODO security problem - shouldn't do the following assignment blindly
169
+ @event_registration.attributes = params[:event_registration] unless params[:event_registration].nil?
170
+
171
+ #--- tie registration to student if they are logged in
172
+ @event_registration.student_id = @register_user.student_id if @use_login_info
173
+
174
+ @photo = ((params[:photo].nil? || params[:photo][:image].blank?) ? nil : EventRegistrationPhoto.new(params[:photo]))
175
+ if @event_registration.valid? && (@photo.nil? || @photo.valid?)
176
+
177
+ if @event_registration.save && (@photo.nil? || @photo.save)
178
+ @event_registration.photo = @photo unless @photo.nil?
179
+ @event_registration.update_attribute(:item_code, @event_registration.event_payment.shoppingcart_code) unless (@event_registration.event_payment.nil? || @event_registration.event_payment.shoppingcart_code.blank?)
180
+
181
+ unless params[:newsletters].nil?
182
+ #--- they asked to be notified of news, sign them up for the newletter
183
+ params[:newsletters].each do |idtag|
184
+ #--- we don't really care about the return code ---
185
+ rc = Newsletter.add_subscriber( idtag, !@use_login_info ? @event_registration : @event_registration.student,
186
+ :remote_ip => request.remote_ip,
187
+ :subscriber_id => !@use_login_info ? nil : @event_registration.student.id)
188
+ end
189
+ end
190
+ session[:event_registration] = @event_registration.id
191
+
192
+ #--- if shopping cart payment required, add redirect to the link that adds
193
+ #--- the items to the cart. Receipt is emailed after we get confirmation back
194
+ #--- from shopping cart that payment was made.
195
+ if ( !@event_registration.event_payment.nil? and
196
+ @event_registration.event_payment.payment_type == 'cc' and
197
+ !@event_registration.item_code.blank?)
198
+ redirect_to generate_shoppingcart_link(@event_registration) and return
199
+ else
200
+ redirect_to :action => 'success' and return
201
+ end
202
+ end
203
+ end
204
+ end
205
+ end
206
+
207
+ #--- use the overriden template if specified, otherwise the default register.rhtml is used
208
+ @workshop.template.blank? ? render(:action => :register) : render(:action => :register, :layout => "#{account_layouts}/#{@workshop.template}")
209
+ end
210
+
211
+ #-----------------------------------------------------------------------
212
+ def success
213
+ unless session[:event_registration] == nil
214
+ @event_registration = EventRegistration.find_by_id(session[:event_registration])
215
+
216
+ #--- clear out the session information
217
+ session[:event_registration] = nil
218
+ @content = (@event_registration.compile_receipt)[:content]
219
+ else
220
+ #--- somehow sesssion got lost - back to the beginning
221
+ redirect_to :action => 'index'
222
+ end
223
+ end
224
+
225
+ # Clears the session of any information that might be there, and returns
226
+ # user to event information page.
227
+ #-----------------------------------------------------------------------
228
+ def user_cancel
229
+ @workshop = EventWorkshop.find_by_id(params[:workshop])
230
+ @workshop.nil? ? redirect_to('/') : redirect_to(@workshop.eventinfo_url)
231
+ end
232
+
233
+ #------------------------------------------------------------------------------
234
+ def show_registrations
235
+ @student = current_user.student
236
+
237
+ render :layout => "#{account_layouts}/members_backend"
238
+ end
239
+
240
+ #------------------------------------------------------------------------------
241
+ def select_registration
242
+ end
243
+
244
+ #------------------------------------------------------------------------------
245
+ def goto_shopping_cart
246
+ event_registration = EventRegistration.find(params[:id])
247
+ redirect_to generate_shoppingcart_link(event_registration) and return
248
+ end
249
+
250
+ #------------------------------------------------------------------------------
251
+ def update_registration
252
+ redirect_to :action => 'index' and return if params[:id] == nil
253
+ @event_registration = EventRegistration.find_by_token(params[:id])
254
+ if @event_registration.nil?
255
+ flash[:error] = 'This registration is not valid.'
256
+ redirect_to :action => :show_registrations and return
257
+ end
258
+
259
+ @workshop = @event_registration.event_workshop
260
+ unless @workshop.workshop_closed
261
+ if @workshop.require_account
262
+ flash[:warning] = 'Please login to your student account before registering' and return unless login_required
263
+ end
264
+ @use_login_info = @workshop.require_account || (user_signed_in? && !params['no_login'])
265
+
266
+ if put_or_post? && @event_registration.updates_allowed?
267
+ @event_registration.errors.add(:base, 'Please fill in the form') and return if params[:event_registration].nil?
268
+
269
+ #--- TODO security problem - shouldn't do the following assignment blindly
270
+ @event_registration.attributes = params[:event_registration]
271
+ @event_registration.user_updated_at = Time.new
272
+ @event_registration.confirmed_on = Time.new if params[:confirm]
273
+
274
+ @photo = ((params[:photo].nil? || params[:photo][:image].blank?) ? nil : EventRegistrationPhoto.new(params[:photo]))
275
+ if @event_registration.valid? && (@photo.nil? || @photo.valid?) && !@event_registration.custom_field_errors?
276
+
277
+ if @event_registration.save && (@photo.nil? || @photo.save)
278
+ @event_registration.photo = @photo unless @photo.nil?
279
+
280
+ #flash[:notice] = "Registration Updated Successfully"
281
+ redirect_to :action => :update_successful, :id => @event_registration.token and return
282
+ end
283
+ end
284
+ else
285
+ #--- build up the custom field objects
286
+ @workshop.custom_field_defs.each do |c|
287
+ @event_registration.custom_fields.build(:custom_field_def_id => c.id) unless @event_registration.custom_fields.detect { |f| f.custom_field_def_id == c.id }
288
+ end
289
+ end
290
+ end
291
+
292
+ #--- use the overriden template if specified, otherwise the default register.rhtml is used
293
+ render :layout => "#{account_layouts}/#{@workshop.template}" unless @workshop.template.blank?
294
+ end
295
+
296
+ #------------------------------------------------------------------------------
297
+ def update_successful
298
+ @event_registration = EventRegistration.find_by_token(params[:id])
299
+ if @event_registration.nil?
300
+ flash[:error] = 'This registration is not valid.'
301
+ redirect_to :action => :show_registrations and return
302
+ end
303
+ @workshop = @event_registration.event_workshop
304
+ end
305
+
306
+ #------------------------------------------------------------------------------
307
+ def registration_comments
308
+ if params[:id].nil? || (@event_registration = EventRegistration.find_by_token(params[:id])).nil?
309
+ flash[:error] = 'This registration is not valid.'
310
+ redirect_to :action => :show_registrations and return
311
+ end
312
+
313
+ @workshop = @event_registration.event_workshop
314
+ if @workshop.workshop_closed
315
+ flash[:error] = 'This workshop is closed.'
316
+ redirect_to :action => :show_registrations and return
317
+ end
318
+ end
319
+
320
+ #------------------------------------------------------------------------------
321
+ def add_comment
322
+ if params[:id].nil? || (@event_registration = EventRegistration.find_by_token(params[:id])).nil? || @event_registration.event_workshop.workshop_closed || current_user.nil?
323
+ flash[:error] = 'This registration is not valid.'
324
+ redirect_to :action => :show_registrations and return
325
+ end
326
+ @comment = Comment.new(:comment => params[:comment], :user_id => current_user.id)
327
+ @event_registration.add_comment(@comment)
328
+
329
+ #--- give the object a chance to do something if necessary
330
+ @event_registration.comment_notify(@comment) if @event_registration.respond_to?(:comment_notify)
331
+ redirect_to :action => :registration_comments, :id => params[:id]
332
+ end
333
+
334
+ # Show the workshops information page
335
+ #------------------------------------------------------------------------------
336
+ def information_page
337
+ redirect_to :action => 'index' and return if params[:id].nil?
338
+ @event_registration = EventRegistration.find_by_token(params[:id])
339
+ redirect_to :action => 'index' and return if @event_registration.nil?
340
+ @workshop = @event_registration.event_workshop
341
+
342
+ unless permit?("#{SystemRoles::Moderator} on :workshop or #{SystemRoles::Admin} on Event or #{SystemRoles::System}", :event => @workshop.event)
343
+ if @workshop.require_account
344
+ if !user_signed_in? or (user_signed_in? && !@workshop.registered?(current_user.student)) or @workshop.information_text.blank?
345
+ redirect_to :action => :show_registrations and return
346
+ end
347
+ else
348
+ redirect_to :action => 'index' and return if @workshop.information_text.blank?
349
+ redirect_to :action => 'index' and return if @workshop.past?
350
+ end
351
+ end
352
+
353
+ #--- use the overriden template if specified, otherwise the default register.rhtml is used
354
+ @workshop.template.blank? ? render(:action => :information_page) : render(:action => :information_page, :layout => "#{account_layouts}/#{@workshop.template}")
355
+ end
356
+
357
+ # Show the workshops information page
358
+ #------------------------------------------------------------------------------
359
+ def event_information_page
360
+ redirect_to :action => 'index' and return if params[:id].nil?
361
+ @workshop = EventWorkshop.find_by_id(params[:id])
362
+ redirect_to :action => 'index' and return if @workshop.nil? or @workshop.past?
363
+
364
+ #--- use the overriden template if specified, otherwise the default register.rhtml is used
365
+ @workshop.template.blank? ? render(:action => :event_information_page) : render(:action => :event_information_page, :layout => "#{account_layouts}/#{@workshop.template}")
366
+ end
367
+
368
+ =end
@@ -0,0 +1,117 @@
1
+ class RegistrationDatatable
2
+ include ActionView::Helpers::TagHelper
3
+ include DmEvent::RegistrationsHelper
4
+ include DmUtilities::DateHelper
5
+ include DmCore::ApplicationHelper
6
+
7
+ delegate :params, :link_to, :image_tag, :number_to_currency, :time_ago_in_words, to: :@view
8
+ delegate :url_helpers, to: 'DmEvent::Engine.routes'
9
+
10
+ #------------------------------------------------------------------------------
11
+ def initialize(view)
12
+ @view = view
13
+ end
14
+
15
+ #------------------------------------------------------------------------------
16
+ def as_json(options = {})
17
+ {
18
+ sEcho: params[:sEcho].to_i,
19
+ iTotalDisplayRecords: registrations.total_entries,
20
+ iTotalRecords: @workshop.registrations.count,
21
+ aaData: data
22
+ }
23
+ end
24
+
25
+ private
26
+
27
+ #------------------------------------------------------------------------------
28
+ def data
29
+ registrations.map do |registration|
30
+ [
31
+ registration_actions(registration),
32
+ "<span style='white-space:nowrap;'>#{registration.receipt_code}</span>",
33
+ name_and_avatar(registration),
34
+ present(registration).balance_or_paid,
35
+ "<span style='white-space:nowrap;'>#{format_date(registration.created_at)}</span>",
36
+ (registration.user_profile.user ? present(registration.user_profile.user).last_access : colored_label('no user', :gray))
37
+ ]
38
+ end
39
+ end
40
+
41
+ #------------------------------------------------------------------------------
42
+ def registrations
43
+ @registrations ||= fetch_registrations
44
+ end
45
+
46
+ #------------------------------------------------------------------------------
47
+ def name_and_avatar(registration)
48
+ # image_tag(registration.user_profile.public_avatar_url(:sq35), width: 25, height: 25) + link_to(registration.full_name, url_helpers.edit_admin_registration_path(I18n.locale, registration))
49
+ link_to(registration.full_name, url_helpers.edit_admin_registration_path(I18n.locale, registration))
50
+ end
51
+
52
+ #------------------------------------------------------------------------------
53
+ def fetch_registrations
54
+ @workshop = Workshop.find_by_slug(params[:id])
55
+ registrations = @workshop.registrations.includes(:workshop_price, :user_profile => [:user => :current_site_profile]).references(:user_profiles).order("#{sort_column} #{sort_direction}")
56
+ if params[:duplicates].present?
57
+ #--- grab only registrations that have duplicates (based on the user_profile_id)
58
+ grouped = registrations.group(:user_profile_id)
59
+ dups = grouped.count.reject {|x, y| y == 1}.collect {|x, y| x}
60
+ registrations = registrations.where(user_profile_id: dups)
61
+ end
62
+ registrations = registrations.page(page).per_page(per_page)
63
+ if params[:sSearch].present?
64
+ registrations = registrations.where("LOWER(user_profiles.first_name) like :search OR LOWER(user_profiles.last_name) like :search OR LOWER(user_profiles.email) like :search OR receipt_code like :search", search: "%#{params[:sSearch]}%".downcase)
65
+ end
66
+ registrations
67
+ end
68
+
69
+ #------------------------------------------------------------------------------
70
+ def registration_actions(registration)
71
+ actions = ''
72
+ actions += '<div class="btn-group">'
73
+ actions += "<button class='btn btn-xs dropdown-toggle btn-#{registration.current_state} hovertip' data-placement='right' data-toggle='dropdown' title='#{registration.current_state.capitalize} on #{format_date(registration.process_changed_on)}'><i class='caret'></i></button>"
74
+ actions += '<ul class="dropdown-menu">'
75
+ actions += action_list(registration)
76
+ actions += '</ul>'
77
+ actions += '</div>'
78
+ end
79
+
80
+ #------------------------------------------------------------------------------
81
+ def action_list(registration)
82
+ actions = registration.aasm.permissible_events
83
+ actions.sort! {|x,y| x.to_s <=> y.to_s}
84
+
85
+ output = ''
86
+ actions.each do |action|
87
+ output << '<li>' +
88
+ link_to('<i class="icon-chevron-right"></i>'.html_safe + action.to_s.titlecase,
89
+ url_helpers.action_state_admin_registration_path(I18n.locale, registration, :state_event => action),
90
+ {:remote => true, :method => :put}) +
91
+ '</li>'
92
+ end
93
+ return output.html_safe
94
+ end
95
+
96
+ #------------------------------------------------------------------------------
97
+ def page
98
+ params[:iDisplayStart].to_i/per_page + 1
99
+ end
100
+
101
+ #------------------------------------------------------------------------------
102
+ def per_page
103
+ params[:iDisplayLength].to_i > 0 ? params[:iDisplayLength].to_i : 50
104
+ end
105
+
106
+ #------------------------------------------------------------------------------
107
+ def sort_column
108
+ columns = ["aasm_state #{sort_direction}, process_changed_on", 'receipt_code', "LOWER(user_profiles.first_name) #{sort_direction}, LOWER(user_profiles.last_name)", '', 'ems_registrations.created_at', 'user_site_profiles.last_access_at']
109
+ columns[params[:iSortCol_0].to_i]
110
+ end
111
+
112
+ #------------------------------------------------------------------------------
113
+ def sort_direction
114
+ params[:sSortDir_0] == "desc" ? "desc" : "asc"
115
+ end
116
+
117
+ end
@@ -0,0 +1,4 @@
1
+ module DmEvent
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,14 @@
1
+ module DmEvent::RegistrationsHelper
2
+
3
+ #------------------------------------------------------------------------------
4
+ def price_details(workshop_price)
5
+ render :partial => 'dm_event/registrations/workshop_price', :object => workshop_price
6
+ end
7
+
8
+ #------------------------------------------------------------------------------
9
+ def status_label(text, state = :plain, with_icon = true)
10
+ icons = { acceptedx: 'icon-thumbs-up' }.freeze
11
+ icon = icons[state.to_sym]
12
+ colored_label(icon_label(icon, text, :color => '#fff'), state)
13
+ end
14
+ end
@@ -0,0 +1,41 @@
1
+ module DmEvent::WorkshopsHelper
2
+
3
+ #------------------------------------------------------------------------------
4
+ def render_workshop_description(workshop)
5
+ if workshop.description.nil?
6
+ description = ""
7
+ else
8
+ # --- process as markdown
9
+ x = render :inline => workshop.description
10
+ description = liquidize_markdown(x, {})
11
+ end
12
+ return description
13
+ end
14
+
15
+ #------------------------------------------------------------------------------
16
+ def render_workshop_sidebar(workshop)
17
+ return '' if workshop.sidebar.nil?
18
+
19
+ liquidize_markdown(render(:inline => workshop.sidebar), {})
20
+ end
21
+
22
+ # Convert the financial "collected" data into json for pie charts
23
+ #------------------------------------------------------------------------------
24
+ def financial_collected_json(collected)
25
+ json = []
26
+ collected.sort.each do |item|
27
+ json << { label: "#{item[0]}: #{item[1].format(:no_cents_if_whole => true, :symbol => true)}", data: item[1].to_f }
28
+ end
29
+ json.to_json
30
+ end
31
+
32
+ # Convert the financial "collected" data into json for pie charts
33
+ #------------------------------------------------------------------------------
34
+ def financial_collected_monthly_json(collected)
35
+ json = []
36
+ collected.sort.each do |item|
37
+ json << [ "#{item[0].localize("%b")}", collected[item[0]].to_f ]
38
+ end
39
+ json.to_json
40
+ end
41
+ end
@@ -0,0 +1,25 @@
1
+ class PaymentReminderMailer < DmCore::SiteMailer
2
+
3
+ helper DmCore::LiquidHelper
4
+ helper DmCore::UrlHelper
5
+ helper DmCore::AccountHelper
6
+
7
+ layout 'email_templates/dm_event_email_layout'
8
+
9
+ #------------------------------------------------------------------------------
10
+ def payment_reminder(registration)
11
+ account = registration.account
12
+ @subject = I18n.t('ems.ticket_payment_reminder_subject', value: registration.workshop.title)
13
+ @recipients = registration.email
14
+ @registration = registration
15
+ @payment_owed = registration.payment_owed.format
16
+ @payment_link = registration.payment_url
17
+
18
+ headers = { "Reply-To" => account.preferred_smtp_from_email, "Return-Path" => account.preferred_smtp_from_email }
19
+ mail(to: @recipients, subject: @subject, theme: account.account_prefix,
20
+ bcc: account.preferred_archive_email,
21
+ template_path: 'layouts/email_templates',
22
+ template_name: 'dm_event_payment_reminder')
23
+ end
24
+
25
+ end
@@ -0,0 +1,31 @@
1
+ class RegistrationNotifyMailer < DmCore::SiteMailer
2
+
3
+ helper DmCore::LiquidHelper
4
+ helper DmCore::UrlHelper
5
+ helper DmCore::AccountHelper
6
+
7
+ layout 'email_templates/dm_event_email_layout'
8
+
9
+ #------------------------------------------------------------------------------
10
+ def registration_notify(registration, content, substitutions)
11
+ contact_email = registration.workshop.contact_email
12
+ account = registration.account
13
+ @subject = substitutions['subject']
14
+ @recipients = registration.email
15
+ @bcc = []
16
+ @bcc << account.preferred_archive_email if account.preferred_archive_email
17
+ @bcc << contact_email if registration.workshop.bcc_contact_email
18
+ @registration = registration
19
+ @content = content
20
+ @state = substitutions['state']
21
+
22
+ headers = { "Reply-To" => (contact_email != "") ? contact_email : account.preferred_smtp_from_email,
23
+ "Return-Path" => account.preferred_smtp_from_email }
24
+
25
+ mail(to: @recipients, subject: @subject, bcc: @bcc, theme: account.account_prefix) do |format|
26
+ format.text { render "layouts/email_templates/dm_event_registration_notify.text.erb" }
27
+ format.html { render "layouts/email_templates/dm_event_registration_notify.html.erb" }
28
+ end
29
+ end
30
+
31
+ end
@@ -0,0 +1,38 @@
1
+ # Wrap forum specific CanCan rules. Should be included in the main app's
2
+ # Ability class.
3
+ # NOTE: When checking abilities, don't check for Class level abilities,
4
+ # unless you don't care about the instance level. For example, don't
5
+ # use both styles
6
+ # can? :moderate, Forum
7
+ # can? :moderate, @forum
8
+ # In this case, if you need to check the class level, then use specific
9
+ # current_user.has_role? :moderator, Forum
10
+ #------------------------------------------------------------------------------
11
+
12
+ module DmEvent
13
+ module Concerns
14
+ module Ability
15
+ def dm_event_abilities(user)
16
+ if user
17
+ if user.has_role?(:event_manager)
18
+ can :manage_events, :all
19
+ can :access_admin, :all
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ #------------------------------------------------------------------------------
28
+ # The abilities get basically compiled. So if you use
29
+ #
30
+ # can :moderate, Forum, :id => Forum.with_role(:moderator, user).map(&:id)
31
+ #
32
+ # this will execute the Forum.with_role query once during Ability.new. However
33
+ #
34
+ # can :moderate, Forum do |forum|
35
+ # user.has_role? :moderator, forum
36
+ # end
37
+ #
38
+ # this will execute the has_role? block on each call to can?