dm_core 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 (522) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +22 -0
  3. data/README.md +25 -0
  4. data/Rakefile +34 -0
  5. data/app/assets/images/dm_core/draft_menu_bg.png +0 -0
  6. data/app/assets/images/dm_core/expand.png +0 -0
  7. data/app/assets/images/dm_core/flags/ad.gif +0 -0
  8. data/app/assets/images/dm_core/flags/ae.gif +0 -0
  9. data/app/assets/images/dm_core/flags/af.gif +0 -0
  10. data/app/assets/images/dm_core/flags/ag.gif +0 -0
  11. data/app/assets/images/dm_core/flags/ai.gif +0 -0
  12. data/app/assets/images/dm_core/flags/al.gif +0 -0
  13. data/app/assets/images/dm_core/flags/am.gif +0 -0
  14. data/app/assets/images/dm_core/flags/an.gif +0 -0
  15. data/app/assets/images/dm_core/flags/ao.gif +0 -0
  16. data/app/assets/images/dm_core/flags/ar.gif +0 -0
  17. data/app/assets/images/dm_core/flags/as.gif +0 -0
  18. data/app/assets/images/dm_core/flags/at.gif +0 -0
  19. data/app/assets/images/dm_core/flags/au.gif +0 -0
  20. data/app/assets/images/dm_core/flags/aw.gif +0 -0
  21. data/app/assets/images/dm_core/flags/ax.gif +0 -0
  22. data/app/assets/images/dm_core/flags/az.gif +0 -0
  23. data/app/assets/images/dm_core/flags/ba.gif +0 -0
  24. data/app/assets/images/dm_core/flags/bb.gif +0 -0
  25. data/app/assets/images/dm_core/flags/bd.gif +0 -0
  26. data/app/assets/images/dm_core/flags/be.gif +0 -0
  27. data/app/assets/images/dm_core/flags/bf.gif +0 -0
  28. data/app/assets/images/dm_core/flags/bg.gif +0 -0
  29. data/app/assets/images/dm_core/flags/bh.gif +0 -0
  30. data/app/assets/images/dm_core/flags/bi.gif +0 -0
  31. data/app/assets/images/dm_core/flags/bj.gif +0 -0
  32. data/app/assets/images/dm_core/flags/bm.gif +0 -0
  33. data/app/assets/images/dm_core/flags/bn.gif +0 -0
  34. data/app/assets/images/dm_core/flags/bo.gif +0 -0
  35. data/app/assets/images/dm_core/flags/br.gif +0 -0
  36. data/app/assets/images/dm_core/flags/bs.gif +0 -0
  37. data/app/assets/images/dm_core/flags/bt.gif +0 -0
  38. data/app/assets/images/dm_core/flags/bv.gif +0 -0
  39. data/app/assets/images/dm_core/flags/bw.gif +0 -0
  40. data/app/assets/images/dm_core/flags/by.gif +0 -0
  41. data/app/assets/images/dm_core/flags/bz.gif +0 -0
  42. data/app/assets/images/dm_core/flags/ca.gif +0 -0
  43. data/app/assets/images/dm_core/flags/cc.gif +0 -0
  44. data/app/assets/images/dm_core/flags/cd.gif +0 -0
  45. data/app/assets/images/dm_core/flags/cf.gif +0 -0
  46. data/app/assets/images/dm_core/flags/cg.gif +0 -0
  47. data/app/assets/images/dm_core/flags/ch.gif +0 -0
  48. data/app/assets/images/dm_core/flags/ci.gif +0 -0
  49. data/app/assets/images/dm_core/flags/ck.gif +0 -0
  50. data/app/assets/images/dm_core/flags/cl.gif +0 -0
  51. data/app/assets/images/dm_core/flags/cm.gif +0 -0
  52. data/app/assets/images/dm_core/flags/cn.gif +0 -0
  53. data/app/assets/images/dm_core/flags/co.gif +0 -0
  54. data/app/assets/images/dm_core/flags/cr.gif +0 -0
  55. data/app/assets/images/dm_core/flags/cs.gif +0 -0
  56. data/app/assets/images/dm_core/flags/cu.gif +0 -0
  57. data/app/assets/images/dm_core/flags/cv.gif +0 -0
  58. data/app/assets/images/dm_core/flags/cx.gif +0 -0
  59. data/app/assets/images/dm_core/flags/cy.gif +0 -0
  60. data/app/assets/images/dm_core/flags/cz.gif +0 -0
  61. data/app/assets/images/dm_core/flags/de.gif +0 -0
  62. data/app/assets/images/dm_core/flags/dj.gif +0 -0
  63. data/app/assets/images/dm_core/flags/dk.gif +0 -0
  64. data/app/assets/images/dm_core/flags/dm.gif +0 -0
  65. data/app/assets/images/dm_core/flags/do.gif +0 -0
  66. data/app/assets/images/dm_core/flags/dz.gif +0 -0
  67. data/app/assets/images/dm_core/flags/ec.gif +0 -0
  68. data/app/assets/images/dm_core/flags/ee.gif +0 -0
  69. data/app/assets/images/dm_core/flags/eg.gif +0 -0
  70. data/app/assets/images/dm_core/flags/eh.gif +0 -0
  71. data/app/assets/images/dm_core/flags/en.gif +0 -0
  72. data/app/assets/images/dm_core/flags/england.gif +0 -0
  73. data/app/assets/images/dm_core/flags/er.gif +0 -0
  74. data/app/assets/images/dm_core/flags/es.gif +0 -0
  75. data/app/assets/images/dm_core/flags/et.gif +0 -0
  76. data/app/assets/images/dm_core/flags/fam.gif +0 -0
  77. data/app/assets/images/dm_core/flags/fi.gif +0 -0
  78. data/app/assets/images/dm_core/flags/fj.gif +0 -0
  79. data/app/assets/images/dm_core/flags/fk.gif +0 -0
  80. data/app/assets/images/dm_core/flags/fm.gif +0 -0
  81. data/app/assets/images/dm_core/flags/fo.gif +0 -0
  82. data/app/assets/images/dm_core/flags/fr.gif +0 -0
  83. data/app/assets/images/dm_core/flags/ga.gif +0 -0
  84. data/app/assets/images/dm_core/flags/gb.gif +0 -0
  85. data/app/assets/images/dm_core/flags/gd.gif +0 -0
  86. data/app/assets/images/dm_core/flags/ge.gif +0 -0
  87. data/app/assets/images/dm_core/flags/gh.gif +0 -0
  88. data/app/assets/images/dm_core/flags/gi.gif +0 -0
  89. data/app/assets/images/dm_core/flags/gl.gif +0 -0
  90. data/app/assets/images/dm_core/flags/gm.gif +0 -0
  91. data/app/assets/images/dm_core/flags/gn.gif +0 -0
  92. data/app/assets/images/dm_core/flags/gp.gif +0 -0
  93. data/app/assets/images/dm_core/flags/gq.gif +0 -0
  94. data/app/assets/images/dm_core/flags/gr.gif +0 -0
  95. data/app/assets/images/dm_core/flags/gs.gif +0 -0
  96. data/app/assets/images/dm_core/flags/gt.gif +0 -0
  97. data/app/assets/images/dm_core/flags/gu.gif +0 -0
  98. data/app/assets/images/dm_core/flags/gw.gif +0 -0
  99. data/app/assets/images/dm_core/flags/gy.gif +0 -0
  100. data/app/assets/images/dm_core/flags/hk.gif +0 -0
  101. data/app/assets/images/dm_core/flags/hn.gif +0 -0
  102. data/app/assets/images/dm_core/flags/hr.gif +0 -0
  103. data/app/assets/images/dm_core/flags/ht.gif +0 -0
  104. data/app/assets/images/dm_core/flags/hu.gif +0 -0
  105. data/app/assets/images/dm_core/flags/id.gif +0 -0
  106. data/app/assets/images/dm_core/flags/ie.gif +0 -0
  107. data/app/assets/images/dm_core/flags/il.gif +0 -0
  108. data/app/assets/images/dm_core/flags/in.gif +0 -0
  109. data/app/assets/images/dm_core/flags/io.gif +0 -0
  110. data/app/assets/images/dm_core/flags/iq.gif +0 -0
  111. data/app/assets/images/dm_core/flags/ir.gif +0 -0
  112. data/app/assets/images/dm_core/flags/is.gif +0 -0
  113. data/app/assets/images/dm_core/flags/it.gif +0 -0
  114. data/app/assets/images/dm_core/flags/ja.gif +0 -0
  115. data/app/assets/images/dm_core/flags/jm.gif +0 -0
  116. data/app/assets/images/dm_core/flags/jo.gif +0 -0
  117. data/app/assets/images/dm_core/flags/ke.gif +0 -0
  118. data/app/assets/images/dm_core/flags/kg.gif +0 -0
  119. data/app/assets/images/dm_core/flags/kh.gif +0 -0
  120. data/app/assets/images/dm_core/flags/ki.gif +0 -0
  121. data/app/assets/images/dm_core/flags/km.gif +0 -0
  122. data/app/assets/images/dm_core/flags/kn.gif +0 -0
  123. data/app/assets/images/dm_core/flags/kp.gif +0 -0
  124. data/app/assets/images/dm_core/flags/kr.gif +0 -0
  125. data/app/assets/images/dm_core/flags/kw.gif +0 -0
  126. data/app/assets/images/dm_core/flags/ky.gif +0 -0
  127. data/app/assets/images/dm_core/flags/kz.gif +0 -0
  128. data/app/assets/images/dm_core/flags/la.gif +0 -0
  129. data/app/assets/images/dm_core/flags/lb.gif +0 -0
  130. data/app/assets/images/dm_core/flags/lc.gif +0 -0
  131. data/app/assets/images/dm_core/flags/li.gif +0 -0
  132. data/app/assets/images/dm_core/flags/lk.gif +0 -0
  133. data/app/assets/images/dm_core/flags/lr.gif +0 -0
  134. data/app/assets/images/dm_core/flags/ls.gif +0 -0
  135. data/app/assets/images/dm_core/flags/lt.gif +0 -0
  136. data/app/assets/images/dm_core/flags/lu.gif +0 -0
  137. data/app/assets/images/dm_core/flags/lv.gif +0 -0
  138. data/app/assets/images/dm_core/flags/ly.gif +0 -0
  139. data/app/assets/images/dm_core/flags/ma.gif +0 -0
  140. data/app/assets/images/dm_core/flags/mc.gif +0 -0
  141. data/app/assets/images/dm_core/flags/md.gif +0 -0
  142. data/app/assets/images/dm_core/flags/mg.gif +0 -0
  143. data/app/assets/images/dm_core/flags/mh.gif +0 -0
  144. data/app/assets/images/dm_core/flags/mk.gif +0 -0
  145. data/app/assets/images/dm_core/flags/ml.gif +0 -0
  146. data/app/assets/images/dm_core/flags/mm.gif +0 -0
  147. data/app/assets/images/dm_core/flags/mn.gif +0 -0
  148. data/app/assets/images/dm_core/flags/mo.gif +0 -0
  149. data/app/assets/images/dm_core/flags/mp.gif +0 -0
  150. data/app/assets/images/dm_core/flags/mq.gif +0 -0
  151. data/app/assets/images/dm_core/flags/mr.gif +0 -0
  152. data/app/assets/images/dm_core/flags/ms.gif +0 -0
  153. data/app/assets/images/dm_core/flags/mt.gif +0 -0
  154. data/app/assets/images/dm_core/flags/mu.gif +0 -0
  155. data/app/assets/images/dm_core/flags/mv.gif +0 -0
  156. data/app/assets/images/dm_core/flags/mw.gif +0 -0
  157. data/app/assets/images/dm_core/flags/mx.gif +0 -0
  158. data/app/assets/images/dm_core/flags/my.gif +0 -0
  159. data/app/assets/images/dm_core/flags/mz.gif +0 -0
  160. data/app/assets/images/dm_core/flags/na.gif +0 -0
  161. data/app/assets/images/dm_core/flags/nc.gif +0 -0
  162. data/app/assets/images/dm_core/flags/ne.gif +0 -0
  163. data/app/assets/images/dm_core/flags/nf.gif +0 -0
  164. data/app/assets/images/dm_core/flags/ng.gif +0 -0
  165. data/app/assets/images/dm_core/flags/ni.gif +0 -0
  166. data/app/assets/images/dm_core/flags/nl.gif +0 -0
  167. data/app/assets/images/dm_core/flags/no.gif +0 -0
  168. data/app/assets/images/dm_core/flags/np.gif +0 -0
  169. data/app/assets/images/dm_core/flags/nr.gif +0 -0
  170. data/app/assets/images/dm_core/flags/nu.gif +0 -0
  171. data/app/assets/images/dm_core/flags/nz.gif +0 -0
  172. data/app/assets/images/dm_core/flags/om.gif +0 -0
  173. data/app/assets/images/dm_core/flags/pa.gif +0 -0
  174. data/app/assets/images/dm_core/flags/pe.gif +0 -0
  175. data/app/assets/images/dm_core/flags/pf.gif +0 -0
  176. data/app/assets/images/dm_core/flags/pg.gif +0 -0
  177. data/app/assets/images/dm_core/flags/ph.gif +0 -0
  178. data/app/assets/images/dm_core/flags/pk.gif +0 -0
  179. data/app/assets/images/dm_core/flags/pl.gif +0 -0
  180. data/app/assets/images/dm_core/flags/pm.gif +0 -0
  181. data/app/assets/images/dm_core/flags/pn.gif +0 -0
  182. data/app/assets/images/dm_core/flags/pr.gif +0 -0
  183. data/app/assets/images/dm_core/flags/ps.gif +0 -0
  184. data/app/assets/images/dm_core/flags/pt.gif +0 -0
  185. data/app/assets/images/dm_core/flags/pw.gif +0 -0
  186. data/app/assets/images/dm_core/flags/py.gif +0 -0
  187. data/app/assets/images/dm_core/flags/qa.gif +0 -0
  188. data/app/assets/images/dm_core/flags/ro.gif +0 -0
  189. data/app/assets/images/dm_core/flags/ru.gif +0 -0
  190. data/app/assets/images/dm_core/flags/rw.gif +0 -0
  191. data/app/assets/images/dm_core/flags/sa.gif +0 -0
  192. data/app/assets/images/dm_core/flags/sb.gif +0 -0
  193. data/app/assets/images/dm_core/flags/sc.gif +0 -0
  194. data/app/assets/images/dm_core/flags/scotland.gif +0 -0
  195. data/app/assets/images/dm_core/flags/sd.gif +0 -0
  196. data/app/assets/images/dm_core/flags/se.gif +0 -0
  197. data/app/assets/images/dm_core/flags/sg.gif +0 -0
  198. data/app/assets/images/dm_core/flags/sh.gif +0 -0
  199. data/app/assets/images/dm_core/flags/si.gif +0 -0
  200. data/app/assets/images/dm_core/flags/sk.gif +0 -0
  201. data/app/assets/images/dm_core/flags/sl.gif +0 -0
  202. data/app/assets/images/dm_core/flags/sm.gif +0 -0
  203. data/app/assets/images/dm_core/flags/sn.gif +0 -0
  204. data/app/assets/images/dm_core/flags/so.gif +0 -0
  205. data/app/assets/images/dm_core/flags/sr.gif +0 -0
  206. data/app/assets/images/dm_core/flags/st.gif +0 -0
  207. data/app/assets/images/dm_core/flags/sv.gif +0 -0
  208. data/app/assets/images/dm_core/flags/sy.gif +0 -0
  209. data/app/assets/images/dm_core/flags/sz.gif +0 -0
  210. data/app/assets/images/dm_core/flags/tc.gif +0 -0
  211. data/app/assets/images/dm_core/flags/td.gif +0 -0
  212. data/app/assets/images/dm_core/flags/tf.gif +0 -0
  213. data/app/assets/images/dm_core/flags/tg.gif +0 -0
  214. data/app/assets/images/dm_core/flags/th.gif +0 -0
  215. data/app/assets/images/dm_core/flags/tj.gif +0 -0
  216. data/app/assets/images/dm_core/flags/tk.gif +0 -0
  217. data/app/assets/images/dm_core/flags/tl.gif +0 -0
  218. data/app/assets/images/dm_core/flags/tm.gif +0 -0
  219. data/app/assets/images/dm_core/flags/tn.gif +0 -0
  220. data/app/assets/images/dm_core/flags/to.gif +0 -0
  221. data/app/assets/images/dm_core/flags/tr.gif +0 -0
  222. data/app/assets/images/dm_core/flags/tt.gif +0 -0
  223. data/app/assets/images/dm_core/flags/tv.gif +0 -0
  224. data/app/assets/images/dm_core/flags/tw.gif +0 -0
  225. data/app/assets/images/dm_core/flags/tz.gif +0 -0
  226. data/app/assets/images/dm_core/flags/ua.gif +0 -0
  227. data/app/assets/images/dm_core/flags/ug.gif +0 -0
  228. data/app/assets/images/dm_core/flags/um.gif +0 -0
  229. data/app/assets/images/dm_core/flags/us.gif +0 -0
  230. data/app/assets/images/dm_core/flags/uy.gif +0 -0
  231. data/app/assets/images/dm_core/flags/uz.gif +0 -0
  232. data/app/assets/images/dm_core/flags/va.gif +0 -0
  233. data/app/assets/images/dm_core/flags/vc.gif +0 -0
  234. data/app/assets/images/dm_core/flags/ve.gif +0 -0
  235. data/app/assets/images/dm_core/flags/vg.gif +0 -0
  236. data/app/assets/images/dm_core/flags/vi.gif +0 -0
  237. data/app/assets/images/dm_core/flags/vn.gif +0 -0
  238. data/app/assets/images/dm_core/flags/vu.gif +0 -0
  239. data/app/assets/images/dm_core/flags/wales.gif +0 -0
  240. data/app/assets/images/dm_core/flags/wf.gif +0 -0
  241. data/app/assets/images/dm_core/flags/ws.gif +0 -0
  242. data/app/assets/images/dm_core/flags/ye.gif +0 -0
  243. data/app/assets/images/dm_core/flags/yt.gif +0 -0
  244. data/app/assets/images/dm_core/flags/za.gif +0 -0
  245. data/app/assets/images/dm_core/flags/zm.gif +0 -0
  246. data/app/assets/images/dm_core/flags/zw.gif +0 -0
  247. data/app/assets/images/dm_core/user.gif +0 -0
  248. data/app/assets/javascripts/dm_core/admin.js +223 -0
  249. data/app/assets/javascripts/dm_core/admin_extra.js.coffee +118 -0
  250. data/app/assets/javascripts/dm_core/application.js +14 -0
  251. data/app/assets/javascripts/dm_core/common_js.js.coffee +61 -0
  252. data/app/assets/javascripts/dm_core/underscore-1.4.4-min.js +1 -0
  253. data/app/assets/javascripts/dm_core/underscore-1.4.4.js +1227 -0
  254. data/app/assets/stylesheets/dm_core/admin.css +250 -0
  255. data/app/assets/stylesheets/dm_core/application.css +31 -0
  256. data/app/assets/stylesheets/dm_core/font-awesome.css +1479 -0
  257. data/app/assets/stylesheets/dm_core/font/FontAwesome.otf +0 -0
  258. data/app/assets/stylesheets/dm_core/font/fontawesome-webfont.eot +0 -0
  259. data/app/assets/stylesheets/dm_core/font/fontawesome-webfont.svg +399 -0
  260. data/app/assets/stylesheets/dm_core/font/fontawesome-webfont.ttf +0 -0
  261. data/app/assets/stylesheets/dm_core/font/fontawesome-webfont.woff +0 -0
  262. data/app/controllers/dm_core/admin/accounts_controller.rb +125 -0
  263. data/app/controllers/dm_core/admin/admin_controller.rb +133 -0
  264. data/app/controllers/dm_core/admin/comments_controller.rb +70 -0
  265. data/app/controllers/dm_core/admin/dashboard_controller.rb +38 -0
  266. data/app/controllers/dm_core/admin/system_controller.rb +44 -0
  267. data/app/controllers/dm_core/admin/users_controller.rb +106 -0
  268. data/app/controllers/dm_core/application_controller.rb +253 -0
  269. data/app/controllers/dm_core/concerns/profile_controller.rb +41 -0
  270. data/app/controllers/dm_core/profile_controller.rb +8 -0
  271. data/app/datatables/user_datatable.rb +75 -0
  272. data/app/helpers/devise_helper.rb +25 -0
  273. data/app/helpers/dm_core/account_helper.rb +70 -0
  274. data/app/helpers/dm_core/admin/application_helper.rb +23 -0
  275. data/app/helpers/dm_core/application_helper.rb +58 -0
  276. data/app/helpers/dm_core/liquid_helper.rb +79 -0
  277. data/app/helpers/dm_core/params_helper.rb +19 -0
  278. data/app/helpers/dm_core/render_helper.rb +104 -0
  279. data/app/helpers/dm_core/url_helper.rb +189 -0
  280. data/app/helpers/dm_utilities/currency_helper.rb +24 -0
  281. data/app/helpers/dm_utilities/date_helper.rb +72 -0
  282. data/app/inputs/code_editor_input.rb +51 -0
  283. data/app/inputs/text_full_width_input.rb +9 -0
  284. data/app/inputs/toggle_checked_input.rb +9 -0
  285. data/app/inputs/toggle_input.rb +9 -0
  286. data/app/mailers/dm_core/site_mailer.rb +18 -0
  287. data/app/models/account.rb +241 -0
  288. data/app/models/activity.rb +10 -0
  289. data/app/models/address.rb +24 -0
  290. data/app/models/category.rb +18 -0
  291. data/app/models/comment.rb +24 -0
  292. data/app/models/custom_field.rb +99 -0
  293. data/app/models/custom_field_def.rb +61 -0
  294. data/app/models/dm_core/concerns/ability.rb +17 -0
  295. data/app/models/dm_core/concerns/defines_custom_fields.rb +17 -0
  296. data/app/models/dm_core/concerns/friendly_id.rb +57 -0
  297. data/app/models/dm_core/concerns/has_custom_fields.rb +28 -0
  298. data/app/models/dm_core/concerns/public_private.rb +151 -0
  299. data/app/models/dm_core/concerns/user.rb +144 -0
  300. data/app/models/dm_core/concerns/user_profile.rb +113 -0
  301. data/app/models/dm_core/concerns/user_site_profile.rb +65 -0
  302. data/app/models/dm_core/country.rb +8 -0
  303. data/app/models/dm_core/language.rb +59 -0
  304. data/app/models/dm_core/permitted_params.rb +52 -0
  305. data/app/models/follow.rb +13 -0
  306. data/app/models/liquid_validator.rb +26 -0
  307. data/app/models/payment_history.rb +57 -0
  308. data/app/models/presence_default_locale_validator.rb +12 -0
  309. data/app/models/role.rb +12 -0
  310. data/app/models/system_email.rb +15 -0
  311. data/app/models/ultracart/notification.rb +107 -0
  312. data/app/models/ultracart/payment_history.rb +55 -0
  313. data/app/models/user.rb +22 -0
  314. data/app/models/user_profile.rb +9 -0
  315. data/app/models/user_site_profile.rb +11 -0
  316. data/app/presenters/base_presenter.rb +30 -0
  317. data/app/presenters/comment_presenter.rb +20 -0
  318. data/app/presenters/user_presenter.rb +48 -0
  319. data/app/uploaders/avatar_uploader.rb +75 -0
  320. data/app/views/devise/mailer/confirmation_instructions.html.erb +7 -0
  321. data/app/views/devise/mailer/confirmation_instructions.text.erb +7 -0
  322. data/app/views/devise/mailer/reset_password_instructions.html.erb +9 -0
  323. data/app/views/devise/mailer/reset_password_instructions.text.erb +9 -0
  324. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  325. data/app/views/devise/mailer/unlock_instructions.text.erb +7 -0
  326. data/app/views/dm_core/admin/accounts/_settings_menu.html.erb +24 -0
  327. data/app/views/dm_core/admin/accounts/analytics.html.erb +38 -0
  328. data/app/views/dm_core/admin/accounts/email.html.erb +26 -0
  329. data/app/views/dm_core/admin/accounts/general.html.erb +22 -0
  330. data/app/views/dm_core/admin/accounts/media.html.erb +37 -0
  331. data/app/views/dm_core/admin/accounts/metadata.html.erb +22 -0
  332. data/app/views/dm_core/admin/comments/_comment.html.erb +14 -0
  333. data/app/views/dm_core/admin/comments/_comment_edit_form.html.erb +3 -0
  334. data/app/views/dm_core/admin/comments/_comment_form.html.erb +15 -0
  335. data/app/views/dm_core/admin/comments/_comment_list.html.erb +5 -0
  336. data/app/views/dm_core/admin/comments/_comment_section.html.erb +7 -0
  337. data/app/views/dm_core/admin/comments/create.js.erb +4 -0
  338. data/app/views/dm_core/admin/comments/destroy.js.erb +1 -0
  339. data/app/views/dm_core/admin/comments/edit.js.erb +2 -0
  340. data/app/views/dm_core/admin/comments/update.js.erb +2 -0
  341. data/app/views/dm_core/admin/custom_fields/_check_box_collection.html.erb +4 -0
  342. data/app/views/dm_core/admin/custom_fields/_custom_field_def_fields.html.erb +34 -0
  343. data/app/views/dm_core/admin/custom_fields/_divider.html.erb +1 -0
  344. data/app/views/dm_core/admin/custom_fields/_number_field.html.erb +4 -0
  345. data/app/views/dm_core/admin/custom_fields/_radio_buttons.html.erb +4 -0
  346. data/app/views/dm_core/admin/custom_fields/_select.html.erb +4 -0
  347. data/app/views/dm_core/admin/custom_fields/_text_area.html.erb +4 -0
  348. data/app/views/dm_core/admin/custom_fields/_text_field.html.erb +4 -0
  349. data/app/views/dm_core/admin/dashboard/_index_sidebar.html.erb +22 -0
  350. data/app/views/dm_core/admin/dashboard/_widget_recent_new_users.html.erb +23 -0
  351. data/app/views/dm_core/admin/dashboard/_widget_recent_user_activity.html.erb +21 -0
  352. data/app/views/dm_core/admin/dashboard/index.html.erb +7 -0
  353. data/app/views/dm_core/admin/dashboard/update_site_assets.html.erb +5 -0
  354. data/app/views/dm_core/admin/shared/_header_stats_new_users.html.erb +2 -0
  355. data/app/views/dm_core/admin/shared/_header_stats_user_activity.html.erb +2 -0
  356. data/app/views/dm_core/admin/system/show.html.erb +23 -0
  357. data/app/views/dm_core/admin/users/_form.html.erb +44 -0
  358. data/app/views/dm_core/admin/users/edit.html.erb +201 -0
  359. data/app/views/dm_core/admin/users/index.html.erb +30 -0
  360. data/app/views/dm_core/profile/_profile_sidebar.html.erb +6 -0
  361. data/app/views/dm_core/profile/account.html.erb +38 -0
  362. data/app/views/dm_core/profile/details.html.erb +38 -0
  363. data/app/views/layouts/dm_core/application.html.erb +14 -0
  364. data/app/views/layouts/dm_core/maintenance.html.erb +31 -0
  365. data/app/views/layouts/email_templates/default_email_layout.html.erb +289 -0
  366. data/config/initializers/_dm_core.rb +7 -0
  367. data/config/initializers/carrierwave.rb +33 -0
  368. data/config/initializers/devise.rb +252 -0
  369. data/config/initializers/friendly_id.rb +88 -0
  370. data/config/initializers/globalize_easy_accessors.rb +67 -0
  371. data/config/initializers/globalize_papertrail_fix.rb +20 -0
  372. data/config/initializers/globalize_reflections.rb +22 -0
  373. data/config/initializers/rolify.rb +8 -0
  374. data/config/initializers/simple_form.rb +161 -0
  375. data/config/initializers/simple_form_amsterdam.rb +31 -0
  376. data/config/initializers/simple_form_bootstrap.rb +87 -0
  377. data/config/initializers/simple_form_bootstrap3.rb +175 -0
  378. data/config/initializers/will_paginate.rb +87 -0
  379. data/config/locales/custom.cs.yml +82 -0
  380. data/config/locales/custom.de.yml +82 -0
  381. data/config/locales/custom.en.yml +84 -0
  382. data/config/locales/custom.fi.yml +84 -0
  383. data/config/locales/custom.ja.yml +84 -0
  384. data/config/locales/devise.cs.yml +70 -0
  385. data/config/locales/devise.de.yml +60 -0
  386. data/config/locales/devise.en.yml +59 -0
  387. data/config/locales/devise.fi.yml +57 -0
  388. data/config/locales/devise.ja.yml +102 -0
  389. data/config/locales/rails.cs.yml +211 -0
  390. data/config/locales/rails.de-AT.yml +203 -0
  391. data/config/locales/rails.de.yml +203 -0
  392. data/config/locales/rails.en-GB.yml +205 -0
  393. data/config/locales/rails.en-IN.yml +205 -0
  394. data/config/locales/rails.en.yml +205 -0
  395. data/config/locales/rails.fi.yml +199 -0
  396. data/config/locales/rails.fr-CH.yml +207 -0
  397. data/config/locales/rails.fr.yml +215 -0
  398. data/config/locales/rails.ja.yml +197 -0
  399. data/config/locales/simple_form.cs.yml +26 -0
  400. data/config/locales/simple_form.de.yml +26 -0
  401. data/config/locales/simple_form.en.yml +26 -0
  402. data/config/locales/simple_form.fi.yml +26 -0
  403. data/config/locales/simple_form.ja.yml +26 -0
  404. data/config/routes.rb +33 -0
  405. data/db/globalize_seed_data.sql +76 -0
  406. data/db/migrate/20121023202117_add_globalize_countries.rb +49 -0
  407. data/db/migrate/20121028125329_devise_create_users.rb +45 -0
  408. data/db/migrate/20121028125831_add_user_fields.rb +13 -0
  409. data/db/migrate/20121028153317_rolify_create_roles.rb +19 -0
  410. data/db/migrate/20121105205634_add_last_access.rb +9 -0
  411. data/db/migrate/20121110213512_create_versions.rb +18 -0
  412. data/db/migrate/20121110213513_add_object_changes_column_to_versions.rb +11 -0
  413. data/db/migrate/20130206121535_create_dm_core_accounts.rb +12 -0
  414. data/db/migrate/20130206223323_add_account_to_users.rb +8 -0
  415. data/db/migrate/20130207170247_create_preferences.rb +12 -0
  416. data/db/migrate/20130321144726_create_comments.rb +21 -0
  417. data/db/migrate/20130402203739_add_activity.rb +20 -0
  418. data/db/migrate/20130415095617_add_type_to_comments.rb +8 -0
  419. data/db/migrate/20130429191051_add_category.rb +27 -0
  420. data/db/migrate/20130513112751_create_email_table.rb +25 -0
  421. data/db/migrate/20130516143539_add_user_profile.rb +45 -0
  422. data/db/migrate/20130518155712_add_profile_email.rb +13 -0
  423. data/db/migrate/20130620145610_create_payment_history.rb +36 -0
  424. data/db/migrate/20130625091108_change_anchor_field.rb +9 -0
  425. data/db/migrate/20130628112848_create_user_site_profile.rb +26 -0
  426. data/db/migrate/20130708150236_add_avatar.rb +11 -0
  427. data/db/migrate/20130914132041_add_notify_to_payment_history.rb +7 -0
  428. data/db/migrate/20140105133446_acts_as_votable_migration.rb +27 -0
  429. data/db/migrate/20140107112418_add_user_site_profile_uuid.rb +18 -0
  430. data/db/migrate/20140129110547_add_invoice_id.rb +6 -0
  431. data/db/migrate/20140201092656_acts_as_follower_migration.rb +17 -0
  432. data/db/migrate/20140203131320_rename_invoice_id.rb +11 -0
  433. data/db/migrate/20140210195143_add_core_addresses.rb +17 -0
  434. data/db/migrate/20140411190454_papertrail_increase_column.rb +8 -0
  435. data/db/migrate/20140501160009_acts_as_taggable_on_migration.acts_as_taggable_on_engine.rb +31 -0
  436. data/db/migrate/20140501160010_add_missing_unique_indices.acts_as_taggable_on_engine.rb +22 -0
  437. data/db/migrate/20140501160011_add_taggings_counter_cache_to_tags.acts_as_taggable_on_engine.rb +15 -0
  438. data/db/migrate/20140529164730_create_custom_fields.rb +39 -0
  439. data/db/migrate/20140709145503_add_missing_taggable_index.acts_as_taggable_on_engine.rb +10 -0
  440. data/db/migrate/20141216094639_add_favored_locale.rb +18 -0
  441. data/db/migrate/20160128094739_update_papertrail_v4.rb +73 -0
  442. data/db/migrate/20160630095745_create_delayed_jobs.rb +22 -0
  443. data/db/migrate/20160821150111_index_foreign_keys_in_core_accounts.rb +5 -0
  444. data/db/migrate/20160821150113_index_foreign_keys_in_core_addresses.rb +5 -0
  445. data/db/migrate/20160821150114_index_foreign_keys_in_core_categories.rb +5 -0
  446. data/db/migrate/20160821150115_index_foreign_keys_in_core_comments.rb +5 -0
  447. data/db/migrate/20160821150116_index_foreign_keys_in_core_custom_fields.rb +5 -0
  448. data/db/migrate/20160821150117_index_foreign_keys_in_core_payment_histories.rb +7 -0
  449. data/db/migrate/20160821150118_index_foreign_keys_in_core_system_email_translations.rb +5 -0
  450. data/db/migrate/20160821150119_index_foreign_keys_in_core_system_emails.rb +6 -0
  451. data/db/migrate/20160821150128_index_foreign_keys_in_preferences.rb +5 -0
  452. data/db/migrate/20160821150129_index_foreign_keys_in_roles.rb +5 -0
  453. data/db/migrate/20160821150130_index_foreign_keys_in_taggings.rb +5 -0
  454. data/db/migrate/20160821150131_index_foreign_keys_in_user_profiles.rb +7 -0
  455. data/db/migrate/20160821150132_index_foreign_keys_in_user_site_profiles.rb +6 -0
  456. data/db/migrate/20160821150133_index_foreign_keys_in_users_roles.rb +5 -0
  457. data/db/migrate/20160821150134_index_foreign_keys_in_version_associations.rb +5 -0
  458. data/db/migrate/20160821150135_index_foreign_keys_in_versions.rb +5 -0
  459. data/db/seeds.rb +433 -0
  460. data/db/seeds/globalize_countries.rb +239 -0
  461. data/db/seeds/globalize_languages.rb +186 -0
  462. data/lib/dm_core.rb +38 -0
  463. data/lib/dm_core/csv_exporter.rb +210 -0
  464. data/lib/dm_core/csv_importer.rb +16 -0
  465. data/lib/dm_core/engine.rb +51 -0
  466. data/lib/dm_core/liquid_extensions.rb +125 -0
  467. data/lib/dm_core/nls.rb +31 -0
  468. data/lib/dm_core/scio_excel.rb +501 -0
  469. data/lib/dm_core/state_select.rb +135 -0
  470. data/lib/dm_core/version.rb +3 -0
  471. data/lib/tasks/dm_core_tasks.rake +60 -0
  472. data/spec/dummy/README.rdoc +28 -0
  473. data/spec/dummy/Rakefile +6 -0
  474. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  475. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  476. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  477. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  478. data/spec/dummy/app/models/ability.rb +10 -0
  479. data/spec/dummy/app/models/user.rb +6 -0
  480. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  481. data/spec/dummy/bin/bundle +3 -0
  482. data/spec/dummy/bin/rails +4 -0
  483. data/spec/dummy/bin/rake +4 -0
  484. data/spec/dummy/config.ru +4 -0
  485. data/spec/dummy/config/application.rb +27 -0
  486. data/spec/dummy/config/boot.rb +5 -0
  487. data/spec/dummy/config/database.yml +25 -0
  488. data/spec/dummy/config/environment.rb +5 -0
  489. data/spec/dummy/config/environments/development.rb +37 -0
  490. data/spec/dummy/config/environments/production.rb +82 -0
  491. data/spec/dummy/config/environments/test.rb +39 -0
  492. data/spec/dummy/config/initializers/assets.rb +8 -0
  493. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  494. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  495. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  496. data/spec/dummy/config/initializers/inflections.rb +16 -0
  497. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  498. data/spec/dummy/config/initializers/session_store.rb +3 -0
  499. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  500. data/spec/dummy/config/locales/en.yml +23 -0
  501. data/spec/dummy/config/routes.rb +11 -0
  502. data/spec/dummy/config/secrets.yml +22 -0
  503. data/spec/dummy/db/development.sqlite3 +0 -0
  504. data/spec/dummy/db/schema.rb +399 -0
  505. data/spec/dummy/db/test.sqlite3 +0 -0
  506. data/spec/dummy/log/test.log +374 -0
  507. data/spec/dummy/public/404.html +67 -0
  508. data/spec/dummy/public/422.html +67 -0
  509. data/spec/dummy/public/500.html +66 -0
  510. data/spec/dummy/public/favicon.ico +0 -0
  511. data/spec/factories/accounts.rb +9 -0
  512. data/spec/factories/user_profiles.rb +10 -0
  513. data/spec/factories/users.rb +19 -0
  514. data/spec/helpers/account_helper_spec.rb +50 -0
  515. data/spec/models/account_spec.rb +20 -0
  516. data/spec/models/user_spec.rb +99 -0
  517. data/spec/rails_helper.rb +70 -0
  518. data/spec/spec_helper.rb +85 -0
  519. data/spec/support/accounts.rb +19 -0
  520. data/spec/support/devise.rb +44 -0
  521. data/spec/support/fix_locale.rb +57 -0
  522. metadata +1124 -0
@@ -0,0 +1,133 @@
1
+ # This controller is a base class for all other admin controllers
2
+ # scope_current_account gets called through the eventual inheritacne of DmCore::ApplicationController
3
+ #------------------------------------------------------------------------------
4
+ class DmCore::Admin::AdminController < ApplicationController
5
+
6
+ before_filter :authenticate_admin_user!
7
+ before_filter :setup_admin_data
8
+ before_filter :template_setup
9
+
10
+ layout 'admin_theme/admin'
11
+
12
+ include DmCore::ApplicationHelper
13
+ include DmCore::AccountHelper
14
+ include DmCore::Admin::ApplicationHelper
15
+ include AdminTheme::ThemeHelper
16
+
17
+ helper DmAdmin::ApplicationHelper
18
+ helper AdminTheme::ThemeHelper
19
+
20
+ # Make sure some type of administrative user is logged in
21
+ #------------------------------------------------------------------------------
22
+ def authenticate_admin_user!
23
+ authenticate_user!
24
+ unless can?(:access_admin, :all)
25
+ flash[:alert] = "Unauthorized Access!"
26
+ redirect_to current_account.index_path
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ # Initialize the data needed by the admin theme - menus, etc. This way it can
33
+ # be rendered differently by different admin themes.
34
+ #------------------------------------------------------------------------------
35
+ def setup_admin_data
36
+ # not needed if it's an ajax call
37
+ if !request.xhr?
38
+ @admin_theme = {}
39
+ @admin_theme[:brand] = current_account.domain
40
+ @admin_theme[:brand_link] = main_app.index_url
41
+ @admin_theme[:top_menu] = []
42
+ @admin_theme[:main_menu] = []
43
+
44
+ #=== Top Menu
45
+ #--- Users
46
+ item = {text: ' ', icon_class: :users, badge: User.current_account_users.count, link: (can?(:manage, :all) ? dm_core.admin_users_path : '#')}
47
+ @admin_theme[:top_menu] << item
48
+
49
+ #--- Gear menu
50
+ if is_admin? || can?(:manage_content, :all)
51
+ item = { text: '', icon_class: :gear, children: [], link: '#' }
52
+ if defined?(DmCms) && can?(:manage_content, :all)
53
+ item[:children] << {text: 'Clear Page Cache', icon_class: :undo, link: dm_cms.admin_expire_cache_path, link_options: {method: :patch} }
54
+ end
55
+ @admin_theme[:top_menu] << item
56
+
57
+ if is_admin?
58
+ item[:children] << {text: 'Site Settings', icon_class: :gear, link: dm_core.admin_account_path }
59
+ end
60
+
61
+ if is_sysadmin?
62
+ item[:children] << {text: 'Update Assets', icon_class: :refresh, link: dm_core.admin_dashboard_update_site_assets_url, link_options: {method: :patch} }
63
+ end
64
+
65
+ if is_sysadmin?
66
+ item[:children] << {text: 'System Admin', icon_class: :wrench, link: dm_core.admin_system_path }
67
+ end
68
+ end
69
+
70
+ #--- User menu
71
+ item = { text: current_user.display_name, icon_class: :user, children: [], link: '#' }
72
+ item[:children] << {text: 'My profile', icon_class: :user, link: dm_core.edit_profile_account_path }
73
+ item[:children] << {text: 'Logout', icon_class: :exit, link: main_app.destroy_user_session_path, link_options: {method: :delete} }
74
+ @admin_theme[:top_menu] << item
75
+
76
+ #=== Main Menu
77
+ @admin_theme[:main_menu] << {text: 'Dashboard', icon_class: :dashboard, link: dm_core.admin_dashboard_path, active: admin_path_active_class?(dm_core.admin_dashboard_path) }
78
+
79
+ if defined?(DmCms) && can?(:manage_content, :all)
80
+ @admin_theme[:main_menu] << {text: 'Pages', icon_class: :pages, link: dm_cms.admin_cms_pages_path, active: admin_path_active_class?(dm_cms.admin_cms_pages_path, dm_cms.admin_cms_snippets_path) }
81
+ @admin_theme[:main_menu] << {text: 'Blogs', icon_class: :blogs, link: dm_cms.admin_cms_blogs_path, active: admin_path_active_class?(dm_cms.admin_cms_blogs_path) }
82
+ @admin_theme[:main_menu] << {text: 'Media Library', icon_class: :media_library, link: dm_cms.admin_media_files_path, active: admin_path_active_class?(dm_cms.admin_media_files_path) }
83
+ end
84
+
85
+ if defined?(DmEvent) && can?(:manage_events, :all)
86
+ item = { text: 'Events', icon_class: :events, children: [], link: '#' }
87
+ item[:children] << {text: 'Overview', link: dm_event.admin_workshops_path, active: admin_path_active_class?(dm_event.admin_workshops_path) }
88
+ Workshop.upcoming.each do |workshop|
89
+ item[:children] << {text: workshop.title, badge: workshop.registrations.number_of(:attending), link: dm_event.admin_workshop_path(workshop), active: admin_path_active_class?(dm_event.admin_workshop_path(workshop)) }
90
+ end
91
+ @admin_theme[:main_menu] << item
92
+ end
93
+
94
+ if defined?(DmLms) && can?(:manage_coursed, :all)
95
+ item = { text: 'Lexicon', icon_class: :lexicon, children: [], link: '#' }
96
+ item[:children] << {text: 'Lexicon', link: dm_lms.admin_lexicons_path, active: admin_path_active_class?(dm_lms.admin_lexicons_path) }
97
+ item[:children] << {text: 'Categories', link: dm_lms.admin_lexicon_categories_path, active: admin_path_active_class?(dm_lms.admin_lexicon_categories_path) }
98
+ item[:children] << {text: 'Sub Categories', link: dm_lms.admin_lexicon_sub_categories_path, active: admin_path_active_class?(dm_lms.admin_lexicon_sub_categories_path) }
99
+ item[:children] << {text: 'Genres', link: dm_lms.admin_lexicon_genres_path, active: admin_path_active_class?(dm_lms.admin_lexicon_genres_path) }
100
+ @admin_theme[:main_menu] << item
101
+
102
+ item = { text: 'Courses', icon_class: :courses, children: [], link: '#' }
103
+ item[:children] << {text: 'Courses', link: dm_lms.admin_courses_path, active: admin_path_active_class?(dm_lms.admin_courses_path) }
104
+ item[:children] << {text: 'Practice Sets', link: dm_lms.admin_practice_sets_path, active: admin_path_active_class?(dm_lms.admin_practice_sets_path) }
105
+ @admin_theme[:main_menu] << item
106
+ end
107
+
108
+ if defined?(DmForum) && can?(:manage_forums, :all)
109
+ @admin_theme[:main_menu] << {text: 'Forums', icon_class: :forums, link: dm_forum.admin_forum_categories_path, active: admin_path_active_class?(dm_forum.admin_forum_categories_path, dm_forum.admin_forums_path) }
110
+ end
111
+
112
+ if defined?(DmNewsletter) && can?(:manage_newsletters, :all)
113
+ @admin_theme[:main_menu] << {text: 'Newsletter', icon_class: :newsletters, link: dm_newsletter.admin_newsletters_path, active: admin_path_active_class?(dm_newsletter.admin_newsletters_path) }
114
+ end
115
+
116
+ if defined?(DmSubscriptions) && can?(:manage_subscriptions, :all)
117
+ @admin_theme[:main_menu] << {text: 'Subscriptions', icon_class: :subscriptions, link: dm_subscriptions.admin_subscription_plans_path, active: admin_path_active_class?(dm_subscriptions.admin_subscription_plans_path) }
118
+ end
119
+
120
+ #--- give main application a chance to add anything it wants
121
+ if self.respond_to? :admin_specific_menus
122
+ self.admin_specific_menus @admin_theme
123
+ end
124
+ end
125
+ end
126
+
127
+ # Set some values for the template based on the controller
128
+ #------------------------------------------------------------------------------
129
+ def template_setup
130
+ # to be overridden by other controllers
131
+ end
132
+
133
+ end
@@ -0,0 +1,70 @@
1
+ # Common controller for handling comments in the admin interface
2
+ # http://pathfindersoftware.com/2008/07/drying-up-rails-controllers-polymorphic-and-super-controllers/
3
+ #------------------------------------------------------------------------------
4
+ class DmCore::Admin::CommentsController < DmCore::Admin::AdminController
5
+ include DmCore::PermittedParams
6
+
7
+ before_filter :find_commenter
8
+
9
+ # Create a comment
10
+ # :commenter_type => object name of commenting object
11
+ # :commenter_id => object id of commenting object
12
+ # :name => optional prefix of association to use (eg. 'private' for private_comments)
13
+ # :comment[:body] => text of comment
14
+ #------------------------------------------------------------------------------
15
+ def create
16
+ params[:name] ||= 'comments'
17
+ raise "Invalid Parameter" unless params[:name].end_with?('comments')
18
+ association = params[:name].to_sym
19
+
20
+ respond_to do |format|
21
+ if @commenter.respond_to? association
22
+ @comment = @commenter.send(association).create(comment_params.merge(user_id: current_user.id))
23
+ format.html { redirect_to :back }
24
+ format.js
25
+ else
26
+ format.html { redirect_to :back }
27
+ end
28
+ end
29
+ end
30
+
31
+ #------------------------------------------------------------------------------
32
+ def edit
33
+ respond_to do |format|
34
+ format.html { redirect_to :back }
35
+ format.js
36
+ end
37
+ end
38
+
39
+ #------------------------------------------------------------------------------
40
+ def update
41
+ respond_to do |format|
42
+ if @comment.update_attributes(comment_params)
43
+ format.html { redirect_to :back }
44
+ format.js
45
+ end
46
+ end
47
+ end
48
+
49
+ #------------------------------------------------------------------------------
50
+ def destroy
51
+ @comment.destroy if can?(:manage, :all) #|| comment.user == current_user
52
+ respond_to do |format|
53
+ format.html { redirect_to :back }
54
+ format.js
55
+ end
56
+ end
57
+
58
+ private
59
+
60
+ #------------------------------------------------------------------------------
61
+ def find_commenter
62
+ if params[:id]
63
+ @comment = Comment.find(params[:id])
64
+ @commenter = @comment.commentable
65
+ else
66
+ klass = params[:commenter_type].classify.constantize
67
+ @commenter = klass.find(params[:commenter_id])
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,38 @@
1
+ class DmCore::Admin::DashboardController < DmCore::Admin::AdminController
2
+
3
+ #------------------------------------------------------------------------------
4
+ def index
5
+ @users = User.all
6
+ end
7
+
8
+ #------------------------------------------------------------------------------
9
+ def update_site_assets
10
+ if is_sysadmin?
11
+ #--- svn up can't follow a symlink, so resolve it first
12
+ path = File.readlink("#{Rails.root}/public/#{account_site_assets(false)}")
13
+ @results = "Updating 'site_assets'...\r\n"
14
+ @results += `svn up #{path}`
15
+ if File.exists?("#{Account.current.theme_path}/protected_assets")
16
+ path = File.join(File.readlink("#{Account.current.theme_path}"), "protected_assets")
17
+ @results += "\nUpdating 'protected_assets'...\r\n"
18
+ @results += `svn up #{path}`
19
+ end
20
+ end
21
+ end
22
+
23
+ # use whatever is passed in, but strip out anything dangerous. Value will get
24
+ # used as a css selector
25
+ #------------------------------------------------------------------------------
26
+ def change_theme
27
+ cookies[:theme] = {:value => params[:id].replace_non_alphanumeric, :expires => Time.now + 1825.days}
28
+ redirect_to :back
29
+ end
30
+
31
+ private
32
+
33
+ # Set some values for the template based on the controller
34
+ #------------------------------------------------------------------------------
35
+ def template_setup
36
+ content_for :content_title, "Dashboard".html_safe
37
+ end
38
+ end
@@ -0,0 +1,44 @@
1
+ # For managing system wide settings, sites, etc
2
+ #------------------------------------------------------------------------------
3
+ class DmCore::Admin::SystemController < DmCore::Admin::AdminController
4
+ include DmCore::PermittedParams
5
+
6
+ before_filter :authorize_access
7
+
8
+ #------------------------------------------------------------------------------
9
+ def show
10
+ @accounts = Account.unscoped.all.order(:domain)
11
+ end
12
+
13
+ #------------------------------------------------------------------------------
14
+ def general
15
+ if put_or_post?
16
+ @account.general_validation = true
17
+ if @account.update_attributes(account_params)
18
+ redirect_to(dm_core.admin_account_general_path, notice: "Account was successfully updated.") and return
19
+ else
20
+ render action: "general"
21
+ end
22
+ end
23
+ end
24
+
25
+ protected
26
+
27
+ #------------------------------------------------------------------------------
28
+ def authorize_access
29
+ unless is_sysadmin?
30
+ flash[:alert] = "Unauthorized Access!"
31
+ redirect_to current_account.index_path
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ # Set some values for the template based on the controller
38
+ #------------------------------------------------------------------------------
39
+ def template_setup
40
+ content_for :content_title, "System Administration"
41
+ content_for :content_subtitle, "Multi-site Management"
42
+ end
43
+
44
+ end
@@ -0,0 +1,106 @@
1
+ class DmCore::Admin::UsersController < DmCore::Admin::AdminController
2
+ before_filter :authorize_access
3
+ before_filter :template_setup, except: [:edit]
4
+
5
+ # GET /admin/users or GET /admin/users.json
6
+ #------------------------------------------------------------------------------
7
+ def index
8
+ #@users = User.paginate :page => params[:page], :per_page => 25
9
+
10
+ respond_to do |format|
11
+ format.html # index.html.erb
12
+ format.json { render json: UserDatatable.new(view_context) }
13
+ end
14
+ end
15
+
16
+ # GET /admin/users/1 or GET /admin/users/1.json
17
+ #------------------------------------------------------------------------------
18
+ def show
19
+ @user = User.find(params[:id])
20
+
21
+ respond_to do |format|
22
+ format.html # show.html.erb
23
+ format.json { render json: @user }
24
+ end
25
+ end
26
+
27
+ # GET /admin/users/1/edit
28
+ #------------------------------------------------------------------------------
29
+ def edit
30
+ @user = User.find(params[:id])
31
+ end
32
+
33
+ # PUT /admin/users/1 or PUT /admin/users/1.json
34
+ #------------------------------------------------------------------------------
35
+ def update
36
+ @user = User.find(params[:id])
37
+ respond_to do |format|
38
+ roles = params[:user].delete(:roles)
39
+ if params[:user].empty? || @user.update_attributes(user_params)
40
+ @user.update_roles(roles, is_admin?) if roles
41
+ format.html { redirect_to dm_core.admin_users_url, notice: "'#{@user.display_name}' was successfully updated." }
42
+ format.json { head :no_content }
43
+ else
44
+ format.html { render action: "edit" }
45
+ format.json { render json: @user.errors, status: :unprocessable_entity }
46
+ end
47
+ end
48
+ end
49
+
50
+ # DELETE /admin/users/1 or DELETE /admin/users/1.json
51
+ #------------------------------------------------------------------------------
52
+ def destroy
53
+ @user = User.find(params[:id])
54
+ @user.destroy
55
+
56
+ respond_to do |format|
57
+ format.html { redirect_to dm_core.admin_users_url }
58
+ format.json { head :no_content }
59
+ end
60
+ end
61
+
62
+ # Change to a different user, so we can check their permissions, etc
63
+ #------------------------------------------------------------------------------
64
+ def masquerade
65
+ @user = User.find(params[:id])
66
+ if @user
67
+ switch_user(@user)
68
+ redirect_to main_app.root_url
69
+ else
70
+ redirect_to :action => :list
71
+ end
72
+ end
73
+
74
+ #------------------------------------------------------------------------------
75
+ def confirm
76
+ @user = User.find(params[:id])
77
+ if @user && !@user.confirmed?
78
+ if @user.confirm
79
+ redirect_to dm_core.admin_users_url, notice: 'User is now confirmed and should be able to login'
80
+ else
81
+ redirect_to dm_core.edit_admin_user_path(@user), alert: "A problem occurred, unable to confirm user"
82
+ end
83
+ else
84
+ redirect_to dm_core.edit_admin_user_path(@user), alert: 'User is already confirmed'
85
+ end
86
+ end
87
+
88
+ protected
89
+
90
+ #------------------------------------------------------------------------------
91
+ def authorize_access
92
+ unless can? :manage, :all
93
+ flash[:alert] = "Unauthorized Access!"
94
+ redirect_to current_account.index_path
95
+ end
96
+ end
97
+
98
+ private
99
+
100
+ # Set some values for the template based on the controller
101
+ #------------------------------------------------------------------------------
102
+ def template_setup
103
+ content_for :content_title, "User Management"
104
+ end
105
+
106
+ end
@@ -0,0 +1,253 @@
1
+ # main ApplicationController will subclass from DmCore::ApplicationController
2
+ #------------------------------------------------------------------------------
3
+ class DmCore::ApplicationController < ActionController::Base
4
+ include DmCore::PermittedParams
5
+
6
+ around_filter :scope_current_account
7
+
8
+ before_filter :log_additional_data
9
+ # before_filter :record_activity
10
+ before_filter :check_site_assets
11
+ before_filter :set_locale
12
+ before_filter :set_mailer_url_options
13
+ before_filter :update_user
14
+ before_filter :theme_resolver
15
+ before_filter :site_enabled?, :unless => :devise_controller?
16
+ before_filter :ssl_redirect
17
+ before_filter :store_location
18
+ before_filter :set_cache_buster
19
+ before_filter :configure_permitted_parameters, if: :devise_controller?
20
+
21
+ add_flash_types :warning, :error, :info
22
+
23
+ include DmCore::AccountHelper
24
+
25
+ #------------------------------------------------------------------------------
26
+ def index
27
+ redirect_to "/#{current_account.preferred_default_locale}/index", :status => :moved_permanently
28
+ end
29
+
30
+ protected
31
+
32
+ # hook into devise to permit our special parameters
33
+ #------------------------------------------------------------------------------
34
+ def configure_permitted_parameters
35
+ devise_parameter_sanitizer.for(:sign_up) { |u|
36
+ devise_sign_up_params(u)
37
+ }
38
+ end
39
+
40
+
41
+ # Nov 27, 2013: There seems to be a nasty Safari 7 bug (and in iOS7). If a 304 is returned,
42
+ # an empty page can be cached, resulting in a blank page.
43
+ # http://tech.vg.no/2013/10/02/ios7-bug-shows-white-page-when-getting-304-not-modified-from-server/
44
+ # So set headers so that this content will not be cahced, until there is a fix
45
+ # http://stackoverflow.com/questions/711418/how-to-prevent-browser-page-caching-in-rails
46
+ # http://stackoverflow.com/questions/20154740/rails-view-turning-complete-white-after-refreshed-or-visited-several-times
47
+ #------------------------------------------------------------------------------
48
+ def set_cache_buster
49
+ if !request.user_agent.blank? && !request.user_agent.scan(/Safari/).empty? && request.user_agent.scan(/Chrome/).empty? && Rails.env.development?
50
+ response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate"
51
+ response.headers["Pragma"] = "no-cache"
52
+ response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT"
53
+ end
54
+ end
55
+
56
+ # Store last url as long as it isn't a /users path
57
+ # Call from a before_filter - this ensures that if you're coming to a page
58
+ # from an email link, the url gets saved before getting redirected to the login
59
+ #------------------------------------------------------------------------------
60
+ def store_location
61
+ session[:previous_url] = request.original_fullpath unless request.original_fullpath =~ /\/users/
62
+ end
63
+
64
+ # override Devise method, on login go to previous url if possible
65
+ #------------------------------------------------------------------------------
66
+ def after_sign_in_path_for(resource)
67
+ session[:previous_url] || root_path
68
+ end
69
+
70
+ # - if site is not enabled, only allow a logged in Admin user to access pages
71
+ # otherwise, redirect to the 'coming_soon' page
72
+ # - if site is under maintenance, only allow a logged in Admin user to access pages
73
+ # otherwise, redirect to the 'maintenance' page
74
+ #------------------------------------------------------------------------------
75
+ def site_enabled?
76
+ unless current_account.site_enabled? || request.params['slug'] == 'coming_soon'
77
+ unless (user_signed_in? && (current_user.is_admin? || current_user.has_role?(:beta)))
78
+ redirect_to "/#{current_account.preferred_default_locale}/coming_soon"
79
+ return false
80
+ end
81
+ end
82
+
83
+ if current_account.site_maintenance?
84
+ unless (user_signed_in? && (current_user.is_admin? || current_user.has_role?(:beta)))
85
+ render text: '', layout: 'dm_core/maintenance'
86
+ return false
87
+ end
88
+ end
89
+ end
90
+
91
+ #------------------------------------------------------------------------------
92
+ def ssl_redirect
93
+ if Rails.env.production? && current_account.ssl_enabled?
94
+ if request.ssl? && !use_ssl? || !request.ssl? && use_ssl?
95
+ protocol = request.ssl? ? "http" : "https"
96
+ redirect_to({protocol: "#{protocol}://"}.merge(params), :flash => flash)
97
+ end
98
+ end
99
+ end
100
+
101
+ # override in other controllers
102
+ #------------------------------------------------------------------------------
103
+ def use_ssl?
104
+ true # user_signed_in? (but would need to ensure Devise runs under ssl)
105
+ end
106
+
107
+ # Choose the theme based on the account prefix in the Account
108
+ #------------------------------------------------------------------------------
109
+ def theme_resolver
110
+ theme(current_account.account_prefix) if DmCore.config.enable_themes
111
+ end
112
+
113
+ #------------------------------------------------------------------------------
114
+ def set_mailer_url_options
115
+ ActionMailer::Base.default_url_options[:host] = request.host_with_port
116
+ end
117
+
118
+ # #------------------------------------------------------------------------------
119
+ # def record_activity
120
+ # if Rails.env.production?
121
+ # activity = Activity.new
122
+ #
123
+ # #--- who is doing the activity?
124
+ # activity.session_id = session['session_id'] unless session.nil?
125
+ # activity.user_id = current_user.id unless current_user.nil?
126
+ # activity.browser = request.env['HTTP_USER_AGENT']
127
+ # activity.ip_address = request.env['REMOTE_ADDR']
128
+ #
129
+ # #--- what are they doing?
130
+ # activity.controller = controller_name
131
+ # activity.action = action_name
132
+ # activity.params = params.to_json
133
+ # activity.slug = params['slug'] unless params['slug'].blank?
134
+ # activity.lesson = [params['course_slug'], params['lesson_slug'], params['content_slug']].join(',') unless params['course_slug'].blank?
135
+ #
136
+ # activity.save!
137
+ # end
138
+ # end
139
+
140
+ # Sets the default value for the url options. Seems to allow links/redirect_to
141
+ # to have the proper value for the locale in the url
142
+ #------------------------------------------------------------------------------
143
+ def default_url_options(options={})
144
+ options.merge({ locale: I18n.locale })
145
+ end
146
+
147
+ # try to weed out missing asset requests - if we make it here and the path starts
148
+ # with 'site_assets', then missing asset was requested, 404 out quickly
149
+ #------------------------------------------------------------------------------
150
+ def check_site_assets
151
+ if request.path.start_with?('/site_assets')
152
+ render(file: 'public/404.html', status: :not_found, layout: false) && false
153
+ else
154
+ true
155
+ end
156
+ end
157
+
158
+ # Set the locale of this request.
159
+ #------------------------------------------------------------------------------
160
+ def set_locale
161
+ begin
162
+ DmCore::Language.locale = (!params[:locale].blank? ? params[:locale] : current_account.preferred_default_locale)
163
+ rescue I18n::InvalidLocale
164
+ # if it's an invalid locale, append the default locale and try again
165
+ # this also fixes the case of using simple link names on a hoem page.
166
+ # So if home page is "http://example.com" and the link is <a href="calendar">
167
+ # then the link is "http://example.com/calendar", instead of "http://example.com/en/calendar"
168
+ # This will allow that to work.
169
+ redirect_to "/#{current_account.preferred_default_locale}#{request.path}"
170
+ end
171
+ end
172
+
173
+ # Update the user's last_access if signed_in
174
+ #------------------------------------------------------------------------------
175
+ def update_user
176
+ current_user.update_last_access if current_user && signed_in?
177
+ end
178
+
179
+ # Used for accessing a presenter inside a controller
180
+ #------------------------------------------------------------------------------
181
+ def present(object, klass = nil)
182
+ klass ||= "#{object.class}Presenter".constantize
183
+ klass.new(object, view_context)
184
+ end
185
+
186
+ # FORCE to implement content_for in controller. This is so we can use it in
187
+ # the pages_controller to set the page title
188
+ #------------------------------------------------------------------------------
189
+ def view_context
190
+ super.tap do |view|
191
+ (@_content_for || {}).each do |name,content|
192
+ view.content_for name, content
193
+ end
194
+ end
195
+ end
196
+ def content_for(name, content) # no blocks allowed yet
197
+ @_content_for ||= {}
198
+ if @_content_for[name].respond_to?(:<<)
199
+ @_content_for[name] << content
200
+ else
201
+ @_content_for[name] = content
202
+ end
203
+ end
204
+ def content_for?(name)
205
+ @_content_for[name].present?
206
+ end
207
+
208
+ # determine what filters are set for this controller - useful for debugging
209
+ #------------------------------------------------------------------------------
210
+ def self.filters(kind = nil)
211
+ all_filters = _process_action_callbacks
212
+ all_filters = all_filters.select{|f| f.kind == kind} if kind
213
+ all_filters.map(&:filter)
214
+ end
215
+
216
+ def self.before_filters
217
+ filters(:before)
218
+ end
219
+
220
+ def self.after_filters
221
+ filters(:after)
222
+ end
223
+
224
+ def self.around_filters
225
+ filters(:around)
226
+ end
227
+
228
+ # Store any additional data to be used by the ExceptionNotification gem
229
+ #------------------------------------------------------------------------------
230
+ def log_additional_data
231
+ request.env["exception_notifier.exception_data"] = { :user => current_user, :account => current_account }
232
+ end
233
+
234
+ # Note: rescue_from should be listed from generic exception to most specific
235
+ #------------------------------------------------------------------------------
236
+ rescue_from CanCan::AccessDenied do |exception|
237
+ #--- Redirect to the index page if we get an access denied
238
+ redirect_to main_app.root_url, :alert => exception.message
239
+ end
240
+ rescue_from Account::LoginRequired do |exception|
241
+ #--- Redirect to the login page
242
+ redirect_to main_app.new_user_session_path, :alert => exception.message
243
+ end
244
+ rescue_from Account::DomainNotFound do |exception|
245
+ #--- log the invalid domain and render nothing.
246
+ logger.error "=====> #{exception.message} URL: #{request.url} REMOTE_ADDR: #{request.remote_addr}"
247
+ render :nothing => true
248
+ end
249
+ rescue_from I18n::InvalidLocale do |exception|
250
+ #--- an invalid locale was specified - raise error to show 404 page
251
+ raise ActionController::RoutingError.new('Not Found')
252
+ end
253
+ end