underworld 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (365) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/LICENSE +339 -0
  5. data/Rakefile +48 -0
  6. data/app/assets/fonts/DroidNaskh-Bold.ttf +0 -0
  7. data/app/assets/fonts/DroidNaskh-Regular.ttf +0 -0
  8. data/app/assets/fonts/OpenSans-Bold.ttf +0 -0
  9. data/app/assets/fonts/OpenSans-BoldItalic.ttf +0 -0
  10. data/app/assets/fonts/OpenSans-ExtraBold.ttf +0 -0
  11. data/app/assets/fonts/OpenSans-ExtraBoldItalic.ttf +0 -0
  12. data/app/assets/fonts/OpenSans-Italic.ttf +0 -0
  13. data/app/assets/fonts/OpenSans-Light.ttf +0 -0
  14. data/app/assets/fonts/OpenSans-LightItalic.ttf +0 -0
  15. data/app/assets/fonts/OpenSans-Regular.ttf +0 -0
  16. data/app/assets/fonts/OpenSans-Semibold.ttf +0 -0
  17. data/app/assets/fonts/OpenSans-SemiboldItalic.ttf +0 -0
  18. data/app/assets/images/underworld/select2-spinner.gif +0 -0
  19. data/app/assets/images/underworld/select2.png +0 -0
  20. data/app/assets/images/underworld/select2x2.png +0 -0
  21. data/app/assets/javascripts/underworld/application.js +16 -0
  22. data/app/assets/javascripts/underworld/dashboard/application.js.erb +30 -0
  23. data/app/assets/javascripts/underworld/dashboard/functions.js.erb +50 -0
  24. data/app/assets/javascripts/underworld/dashboard/init.js.coffee +33 -0
  25. data/app/assets/javascripts/underworld/dashboard/lib/actions.js +7 -0
  26. data/app/assets/javascripts/underworld/dashboard/lib/amd.js.coffee.erb +0 -0
  27. data/app/assets/javascripts/underworld/dashboard/lib/flash_message.js +71 -0
  28. data/app/assets/javascripts/underworld/dashboard/lib/locale.js +14 -0
  29. data/app/assets/javascripts/underworld/dashboard/lib/misc.js +5 -0
  30. data/app/assets/javascripts/underworld/dashboard/lib/string.js +3 -0
  31. data/app/assets/javascripts/underworld/dashboard/lib/ujs_patches.js.coffee +28 -0
  32. data/app/assets/javascripts/underworld/dashboard/manifest.js +5 -0
  33. data/app/assets/javascripts/underworld/dashboard/variables.js.erb +6 -0
  34. data/app/assets/javascripts/underworld/groups.js +2 -0
  35. data/app/assets/javascripts/underworld/home.js +2 -0
  36. data/app/assets/javascripts/underworld/i18n.js +13 -0
  37. data/app/assets/javascripts/underworld/simple.js +20 -0
  38. data/app/assets/javascripts/underworld/users.js +2 -0
  39. data/app/assets/stylesheets/underworld/dashboard/loadindicator.scss +17 -0
  40. data/app/assets/stylesheets/underworld/dashboard/ltr/application.css +38 -0
  41. data/app/assets/stylesheets/underworld/dashboard/ltr/base.css.scss +0 -0
  42. data/app/assets/stylesheets/underworld/dashboard/rtl/application.css +11 -0
  43. data/app/assets/stylesheets/underworld/dashboard/rtl/base.css.scss +0 -0
  44. data/app/assets/stylesheets/underworld/dashboard/share.scss +62 -0
  45. data/app/assets/stylesheets/underworld/dashboard/variables.scss +9 -0
  46. data/app/assets/stylesheets/underworld/ltr/application.css +0 -0
  47. data/app/assets/stylesheets/underworld/rtl/application.css +0 -0
  48. data/app/assets/stylesheets/underworld/simple/ltr/application.css +2 -0
  49. data/app/assets/stylesheets/underworld/simple/rtl/application.css +2 -0
  50. data/app/assets/stylesheets/underworld/simple/rtl/rtl.scss +16 -0
  51. data/app/assets/stylesheets/underworld/simple/share.scss +11 -0
  52. data/app/controllers/underworld/api_controller.rb +133 -0
  53. data/app/controllers/underworld/application_controller.rb +16 -0
  54. data/app/controllers/underworld/assets_controller.rb +6 -0
  55. data/app/controllers/underworld/dashboard/application_controller.rb +43 -0
  56. data/app/controllers/underworld/dashboard/groups_controller.rb +85 -0
  57. data/app/controllers/underworld/dashboard/profile_controller.rb +49 -0
  58. data/app/controllers/underworld/dashboard/user_messages_controller.rb +27 -0
  59. data/app/controllers/underworld/dashboard/users_controller.rb +116 -0
  60. data/app/controllers/underworld/dashboard_controller.rb +16 -0
  61. data/app/controllers/underworld/omniauth/callbacks_controller.rb +24 -0
  62. data/app/helpers/underworld/application_helper.rb +4 -0
  63. data/app/helpers/underworld/dashboard_helper.rb +107 -0
  64. data/app/helpers/underworld/groups_helper.rb +4 -0
  65. data/app/helpers/underworld/home_helper.rb +4 -0
  66. data/app/helpers/underworld/users_helper.rb +8 -0
  67. data/app/models/application_record.rb +3 -0
  68. data/app/models/underworld/concerns/assignment.rb +16 -0
  69. data/app/models/underworld/concerns/user/auth_definitions.rb +87 -0
  70. data/app/models/underworld/concerns/user/gravatar.rb +11 -0
  71. data/app/models/underworld/concerns/user/mongoid_fields.rb +81 -0
  72. data/app/models/underworld/concerns/user/permission.rb +47 -0
  73. data/app/models/underworld/concerns/user/user_roles.rb +24 -0
  74. data/app/models/underworld/group.rb +57 -0
  75. data/app/models/underworld/permission.rb +43 -0
  76. data/app/models/underworld/user.rb +81 -0
  77. data/app/models/underworld/user_message.rb +6 -0
  78. data/app/policies/underworld/admin_only_policy.rb +66 -0
  79. data/app/policies/underworld/application_policy.rb +55 -0
  80. data/app/policies/underworld/group_policy.rb +8 -0
  81. data/app/policies/underworld/user_message_policy.rb +9 -0
  82. data/app/policies/underworld/user_policy.rb +9 -0
  83. data/app/views/angular/auth/groups/details.html +2 -0
  84. data/app/views/angular/auth/groups/index.html +2 -0
  85. data/app/views/angular/auth/groups/new.html +2 -0
  86. data/app/views/angular/auth/index.html +30 -0
  87. data/app/views/angular/auth/profile/edit.html +54 -0
  88. data/app/views/angular/auth/users/details.html +28 -0
  89. data/app/views/angular/auth/users/index.html +6 -0
  90. data/app/views/angular/auth/users/new.html +57 -0
  91. data/app/views/angular/conversations/details.html +19 -0
  92. data/app/views/angular/conversations/index.html +13 -0
  93. data/app/views/angular/conversations/new.html +39 -0
  94. data/app/views/angular/conversations/show.html +6 -0
  95. data/app/views/angular/conversations/show_details.html +15 -0
  96. data/app/views/angular/fields/boolean/boolean.html +4 -0
  97. data/app/views/angular/fields/control-combo/control-list.html +19 -0
  98. data/app/views/angular/fields/datetime/datetime.html +10 -0
  99. data/app/views/angular/fields/datetime/time.html +25 -0
  100. data/app/views/angular/fields/file/file.html.slim +0 -0
  101. data/app/views/angular/fields/float/float.html +4 -0
  102. data/app/views/angular/fields/image/image.html +1 -0
  103. data/app/views/angular/fields/integer/integer.html +4 -0
  104. data/app/views/angular/fields/relation/relation.html +44 -0
  105. data/app/views/angular/fields/string/string.html +22 -0
  106. data/app/views/angular/fields/tag/tag.html +1 -0
  107. data/app/views/angular/fields/text/text.html +4 -0
  108. data/app/views/angular/filter/index.html +15 -0
  109. data/app/views/angular/index.html +3 -0
  110. data/app/views/angular/locale/fa.po +25 -0
  111. data/app/views/angular/locale/templates.pot +24 -0
  112. data/app/views/angular/logs/index.html +6 -0
  113. data/app/views/angular/modules.html +0 -0
  114. data/app/views/angular/nav.html.erb +39 -0
  115. data/app/views/angular/underworld/views/generic_add_view.html.slim +5 -0
  116. data/app/views/devise/registrations/edit.html.erb +29 -0
  117. data/app/views/devise/registrations/new.html.erb +38 -0
  118. data/app/views/devise/sessions/new.html.erb +37 -0
  119. data/app/views/devise/shared/_links.erb +19 -0
  120. data/app/views/devise/shared/_omni_link.erb +33 -0
  121. data/app/views/kaminari/_first_page.html.slim +3 -0
  122. data/app/views/kaminari/_gap.html.slim +2 -0
  123. data/app/views/kaminari/_last_page.html.slim +3 -0
  124. data/app/views/kaminari/_next_page.html.slim +3 -0
  125. data/app/views/kaminari/_page.html.slim +3 -0
  126. data/app/views/kaminari/_paginator.html.slim +13 -0
  127. data/app/views/kaminari/_prev_page.html.slim +3 -0
  128. data/app/views/layouts/underworld/application.html.erb +79 -0
  129. data/app/views/layouts/underworld/dashboard.html.erb +52 -0
  130. data/app/views/layouts/underworld/simple.html.erb +27 -0
  131. data/app/views/underworld/api/v1/conversations/create.json.jbuilder +1 -0
  132. data/app/views/underworld/api/v1/conversations/destroy.json.jbuilder +1 -0
  133. data/app/views/underworld/api/v1/conversations/index.json.jbuilder +1 -0
  134. data/app/views/underworld/api/v1/conversations/reply.json.jbuilder +1 -0
  135. data/app/views/underworld/api/v1/conversations/show.json.jbuilder +14 -0
  136. data/app/views/underworld/api/v1/conversations/trash.json.jbuilder +1 -0
  137. data/app/views/underworld/api/v1/groups/create.json.jbuilder +4 -0
  138. data/app/views/underworld/api/v1/groups/destroy.html.erb +2 -0
  139. data/app/views/underworld/api/v1/groups/destroy.json.jbuilder +1 -0
  140. data/app/views/underworld/api/v1/groups/edit.html.erb +2 -0
  141. data/app/views/underworld/api/v1/groups/index.html.erb +2 -0
  142. data/app/views/underworld/api/v1/groups/index.json.jbuilder +6 -0
  143. data/app/views/underworld/api/v1/groups/new.html.erb +2 -0
  144. data/app/views/underworld/api/v1/groups/show.html.erb +2 -0
  145. data/app/views/underworld/api/v1/groups/show.json.jbuilder +5 -0
  146. data/app/views/underworld/api/v1/groups/update.json.jbuilder +4 -0
  147. data/app/views/underworld/api/v1/logs/index.json.jbuilder +1 -0
  148. data/app/views/underworld/api/v1/permissions/index.json.jbuilder +1 -0
  149. data/app/views/underworld/api/v1/permissions/user_permissions.json.jbuilder +1 -0
  150. data/app/views/underworld/api/v1/users/create.html.erb +2 -0
  151. data/app/views/underworld/api/v1/users/create.json.jbuilder +1 -0
  152. data/app/views/underworld/api/v1/users/destroy.json.jbuilder +1 -0
  153. data/app/views/underworld/api/v1/users/distroy.html.erb +2 -0
  154. data/app/views/underworld/api/v1/users/edit.html.erb +2 -0
  155. data/app/views/underworld/api/v1/users/index.html.erb +2 -0
  156. data/app/views/underworld/api/v1/users/index.json.jbuilder +4 -0
  157. data/app/views/underworld/api/v1/users/show.html.erb +2 -0
  158. data/app/views/underworld/api/v1/users/show.json.jbuilder +2 -0
  159. data/app/views/underworld/api/v1/users/update.json.jbuilder +1 -0
  160. data/app/views/underworld/dashboard/groups/_form.html.slim +68 -0
  161. data/app/views/underworld/dashboard/groups/create.js.erb +3 -0
  162. data/app/views/underworld/dashboard/groups/edit.html.slim +3 -0
  163. data/app/views/underworld/dashboard/groups/errors.js.erb +3 -0
  164. data/app/views/underworld/dashboard/groups/index.html.slim +47 -0
  165. data/app/views/underworld/dashboard/groups/new.html.slim +2 -0
  166. data/app/views/underworld/dashboard/groups/update.js.erb +3 -0
  167. data/app/views/underworld/dashboard/index.html.erb +0 -0
  168. data/app/views/underworld/dashboard/login_required_page.html.erb +5 -0
  169. data/app/views/underworld/dashboard/not_found.html.slim +9 -0
  170. data/app/views/underworld/dashboard/not_found.js.erb +1 -0
  171. data/app/views/underworld/dashboard/profile/_form.html.erb +33 -0
  172. data/app/views/underworld/dashboard/profile/_profile_form.html.erb +33 -0
  173. data/app/views/underworld/dashboard/profile/create.js.erb +3 -0
  174. data/app/views/underworld/dashboard/profile/edit.html.erb +2 -0
  175. data/app/views/underworld/dashboard/profile/edit_password.html.erb +2 -0
  176. data/app/views/underworld/dashboard/profile/errors.js.erb +3 -0
  177. data/app/views/underworld/dashboard/resource/_form.html.slim +33 -0
  178. data/app/views/underworld/dashboard/resource/_input.html.slim +3 -0
  179. data/app/views/underworld/dashboard/resource/create.js.erb +3 -0
  180. data/app/views/underworld/dashboard/resource/destroy.js.erb +2 -0
  181. data/app/views/underworld/dashboard/resource/edit.html.slim +3 -0
  182. data/app/views/underworld/dashboard/resource/index.html.slim +60 -0
  183. data/app/views/underworld/dashboard/resource/new.html.slim +2 -0
  184. data/app/views/underworld/dashboard/resource/show.html.slim +22 -0
  185. data/app/views/underworld/dashboard/resource/update.js.erb +3 -0
  186. data/app/views/underworld/dashboard/shared/_content_header.html.slim +15 -0
  187. data/app/views/underworld/dashboard/shared/_control_sidebar.html.slim +50 -0
  188. data/app/views/underworld/dashboard/shared/_footer.html.slim +7 -0
  189. data/app/views/underworld/dashboard/shared/_header.html.erb +98 -0
  190. data/app/views/underworld/dashboard/shared/_sidebar.html.erb +69 -0
  191. data/app/views/underworld/dashboard/shared/_toolbar.html.slim +0 -0
  192. data/app/views/underworld/dashboard/shared/errors.js.erb +3 -0
  193. data/app/views/underworld/dashboard/user_messages/_form.html.slim +0 -0
  194. data/app/views/underworld/dashboard/user_messages/create.js.erb +0 -0
  195. data/app/views/underworld/dashboard/user_messages/destroy.js.erb +0 -0
  196. data/app/views/underworld/dashboard/user_messages/new.html.slim +72 -0
  197. data/app/views/underworld/dashboard/users/_form.html.slim +73 -0
  198. data/app/views/underworld/dashboard/users/_password_form.html.slim +37 -0
  199. data/app/views/underworld/dashboard/users/create.js.erb +3 -0
  200. data/app/views/underworld/dashboard/users/destroy.js.erb +2 -0
  201. data/app/views/underworld/dashboard/users/edit.html.slim +3 -0
  202. data/app/views/underworld/dashboard/users/edit_password.html.slim +1 -0
  203. data/app/views/underworld/dashboard/users/errors.js.erb +3 -0
  204. data/app/views/underworld/dashboard/users/index.html.slim +66 -0
  205. data/app/views/underworld/dashboard/users/new.html.slim +2 -0
  206. data/app/views/underworld/dashboard/users/show.html.slim +6 -0
  207. data/app/views/underworld/dashboard/users/update.js.erb +3 -0
  208. data/app/views/underworld/dashboard/users/update_password.js.erb +3 -0
  209. data/app/views/underworld/relations/_belongs_to.json.jbuilder +11 -0
  210. data/config/initializers/devise.rb +24 -0
  211. data/config/locales/devise.en.yml +59 -0
  212. data/config/locales/devise.fa.yml +58 -0
  213. data/config/locales/underworld.en.yml +96 -0
  214. data/config/locales/underworld.fa.yml +108 -0
  215. data/config/routes.rb +43 -0
  216. data/config/spring.rb +1 -0
  217. data/db/migrate/20131013091000_devise_create_underworld_users.rb +65 -0
  218. data/db/migrate/20131020124701_create_underworld_groups.rb +15 -0
  219. data/db/migrate/20131021170923_create_underworld_permissions.rb +15 -0
  220. data/db/migrate/20131123120422_add_permissions_groups_table.rb +16 -0
  221. data/db/migrate/20140613120923_add_users_groups_table.rb +13 -0
  222. data/db/migrate/20151122115129_add_uniqueness_index_to_users_groups.rb +11 -0
  223. data/db/migrate/20160310105736_create_underworld_user_messages.rb +25 -0
  224. data/db/seeds.rb +49 -0
  225. data/lib/generators/underworld/install_generator.rb +108 -0
  226. data/lib/generators/underworld/resource_generator.rb +70 -0
  227. data/lib/generators/underworld/resources_generator.rb +20 -0
  228. data/lib/generators/underworld/templates/README +21 -0
  229. data/lib/generators/underworld/templates/SPECS +13 -0
  230. data/lib/generators/underworld/templates/api/controller.rb.erb +60 -0
  231. data/lib/generators/underworld/templates/api_controller.rb +2 -0
  232. data/lib/generators/underworld/templates/dashboard/controller.rb.erb +2 -0
  233. data/lib/generators/underworld/templates/dashboard_controller.rb +18 -0
  234. data/lib/generators/underworld/templates/devise.rb +251 -0
  235. data/lib/generators/underworld/templates/features/api.feature +92 -0
  236. data/lib/generators/underworld/templates/features/api.step.rb +7 -0
  237. data/lib/generators/underworld/templates/features/step_definitions/email_steps.rb +206 -0
  238. data/lib/generators/underworld/templates/features/support/email_spec.rb +1 -0
  239. data/lib/generators/underworld/templates/features/support/env.rb +79 -0
  240. data/lib/generators/underworld/templates/javascripts/application.js +19 -0
  241. data/lib/generators/underworld/templates/policy/application_policy.rb +2 -0
  242. data/lib/generators/underworld/templates/policy/policy.rb.erb +2 -0
  243. data/lib/generators/underworld/templates/seeds.rb +1 -0
  244. data/lib/generators/underworld/templates/spec/factories/groups.rb +5 -0
  245. data/lib/generators/underworld/templates/spec/factories/users.rb +10 -0
  246. data/lib/generators/underworld/templates/spec/spec_helper.rb +69 -0
  247. data/lib/generators/underworld/templates/spec/support/devise.rb +3 -0
  248. data/lib/generators/underworld/templates/stylesheets/dashboard/ltr/application.css +3 -0
  249. data/lib/generators/underworld/templates/stylesheets/dashboard/rtl/application.css +3 -0
  250. data/lib/generators/underworld/templates/stylesheets/ltr/application.css +3 -0
  251. data/lib/generators/underworld/templates/stylesheets/rtl/application.css +3 -0
  252. data/lib/generators/underworld/templates/underworld.rb +12 -0
  253. data/lib/generators/underworld/templates/views/create.json.jbuilder.erb +3 -0
  254. data/lib/generators/underworld/templates/views/destroy.json.jbuilder.erb +1 -0
  255. data/lib/generators/underworld/templates/views/index.json.jbuilder.erb +13 -0
  256. data/lib/generators/underworld/templates/views/show.json.jbuilder.erb +6 -0
  257. data/lib/generators/underworld/templates/views/update.json.jbuilder.erb +6 -0
  258. data/lib/generators/underworld/views_generator.rb +57 -0
  259. data/lib/tasks/docs.rake +6 -0
  260. data/lib/tasks/sync.rake +9 -0
  261. data/lib/tasks/underworld_tasks.rake +38 -0
  262. data/lib/underworld.rb +35 -0
  263. data/lib/underworld/action_dispatch.rb +3 -0
  264. data/lib/underworld/api.rb +42 -0
  265. data/lib/underworld/api/groups_api.rb +41 -0
  266. data/lib/underworld/api/permissions_api.rb +24 -0
  267. data/lib/underworld/api/root.rb +15 -0
  268. data/lib/underworld/api/users_api.rb +20 -0
  269. data/lib/underworld/concerns.rb +7 -0
  270. data/lib/underworld/concerns/authorizable.rb +81 -0
  271. data/lib/underworld/configuration.rb +97 -0
  272. data/lib/underworld/dashboard.rb +11 -0
  273. data/lib/underworld/dashboard/dsl.rb +41 -0
  274. data/lib/underworld/dashboard/dsl/base.rb +133 -0
  275. data/lib/underworld/dashboard/dsl/create.rb +116 -0
  276. data/lib/underworld/dashboard/dsl/form_fields_properties.rb +62 -0
  277. data/lib/underworld/dashboard/dsl/index.rb +45 -0
  278. data/lib/underworld/dashboard/dsl/show.rb +6 -0
  279. data/lib/underworld/dashboard/dsl/update.rb +6 -0
  280. data/lib/underworld/dashboard/helpers/box_helpers.rb +129 -0
  281. data/lib/underworld/dashboard/models.rb +2 -0
  282. data/lib/underworld/dashboard/models/sidebar.rb +139 -0
  283. data/lib/underworld/dashboard/sections.rb +2 -0
  284. data/lib/underworld/dashboard/sections/resource.rb +229 -0
  285. data/lib/underworld/dashboard/sections/resource_create.rb +263 -0
  286. data/lib/underworld/dashboard/sections/resource_destroy.rb +27 -0
  287. data/lib/underworld/dashboard/sections/resource_show.rb +96 -0
  288. data/lib/underworld/dashboard/sections/resources_index.rb +113 -0
  289. data/lib/underworld/dashboard/sections/sidebar.rb +41 -0
  290. data/lib/underworld/discovery.rb +8 -0
  291. data/lib/underworld/discovery/permissions.rb +49 -0
  292. data/lib/underworld/engine.rb +53 -0
  293. data/lib/underworld/exceptions.rb +7 -0
  294. data/lib/underworld/extension.rb +18 -0
  295. data/lib/underworld/extension/base.rb +29 -0
  296. data/lib/underworld/fake_assets.rb +5 -0
  297. data/lib/underworld/i18n.rb +101 -0
  298. data/lib/underworld/initialize.rb +0 -0
  299. data/lib/underworld/liquid.rb +7 -0
  300. data/lib/underworld/liquid/block.rb +14 -0
  301. data/lib/underworld/liquid/render_tag.rb +50 -0
  302. data/lib/underworld/liquid/tag.rb +51 -0
  303. data/lib/underworld/middlewares.rb +1 -0
  304. data/lib/underworld/middlewares/locale.rb +29 -0
  305. data/lib/underworld/omniauth.rb +8 -0
  306. data/lib/underworld/omniauth/callbacks.rb +39 -0
  307. data/lib/underworld/orm.rb +30 -0
  308. data/lib/underworld/routes.rb +117 -0
  309. data/lib/underworld/version.rb +3 -0
  310. data/test/controllers/underworld/dashboard/resource_test.rb +118 -0
  311. data/test/dummy/README.rdoc +28 -0
  312. data/test/dummy/Rakefile +6 -0
  313. data/test/dummy/app/assets/javascripts/application.js +13 -0
  314. data/test/dummy/app/assets/javascripts/dashboard/application.js +19 -0
  315. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  316. data/test/dummy/app/assets/stylesheets/dashboard/ltr/application.css +3 -0
  317. data/test/dummy/app/assets/stylesheets/dashboard/rtl/application.css +3 -0
  318. data/test/dummy/app/assets/stylesheets/ltr/application.css +3 -0
  319. data/test/dummy/app/assets/stylesheets/rtl/application.css +3 -0
  320. data/test/dummy/app/controllers/api_controller.rb +2 -0
  321. data/test/dummy/app/controllers/application_controller.rb +6 -0
  322. data/test/dummy/app/controllers/dashboard/application_controller.rb +18 -0
  323. data/test/dummy/app/helpers/application_helper.rb +2 -0
  324. data/test/dummy/app/policies/application_policy.rb +2 -0
  325. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  326. data/test/dummy/bin/bundle +3 -0
  327. data/test/dummy/bin/rails +4 -0
  328. data/test/dummy/bin/rake +4 -0
  329. data/test/dummy/config.ru +4 -0
  330. data/test/dummy/config/application.rb +23 -0
  331. data/test/dummy/config/boot.rb +5 -0
  332. data/test/dummy/config/database.yml +25 -0
  333. data/test/dummy/config/environment.rb +5 -0
  334. data/test/dummy/config/environments/development.rb +29 -0
  335. data/test/dummy/config/environments/production.rb +80 -0
  336. data/test/dummy/config/environments/test.rb +38 -0
  337. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  338. data/test/dummy/config/initializers/devise.rb +251 -0
  339. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  340. data/test/dummy/config/initializers/formstatic.rb +76 -0
  341. data/test/dummy/config/initializers/formtastic.rb +110 -0
  342. data/test/dummy/config/initializers/inflections.rb +16 -0
  343. data/test/dummy/config/initializers/kaminari_config.rb +10 -0
  344. data/test/dummy/config/initializers/mime_types.rb +5 -0
  345. data/test/dummy/config/initializers/secret_token.rb +12 -0
  346. data/test/dummy/config/initializers/session_store.rb +3 -0
  347. data/test/dummy/config/initializers/underworld.rb +11 -0
  348. data/test/dummy/config/initializers/underworld_assets.rb +1 -0
  349. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  350. data/test/dummy/config/locales/en.yml +23 -0
  351. data/test/dummy/config/routes.rb +13 -0
  352. data/test/dummy/lib/templates/slim/scaffold/_form.html.slim +8 -0
  353. data/test/dummy/public/404.html +58 -0
  354. data/test/dummy/public/422.html +58 -0
  355. data/test/dummy/public/500.html +57 -0
  356. data/test/dummy/public/favicon.ico +0 -0
  357. data/test/fabricators/underworld/groups.rb +27 -0
  358. data/test/fabricators/underworld/permissions.rb +14 -0
  359. data/test/fabricators/underworld/users.rb +17 -0
  360. data/test/generators/install_generator_test.rb +84 -0
  361. data/test/integration/underworld/authentication_test.rb +36 -0
  362. data/test/integration/underworld/dashboard_test.rb +64 -0
  363. data/test/test_helper.rb +72 -0
  364. metadata +1045 -0
  365. metadata.gz.sig +0 -0
@@ -0,0 +1,2 @@
1
+ //= require admin_lte/rtl/admin_lte
2
+ //= require underworld/simple/share
@@ -0,0 +1,16 @@
1
+ @font-face {
2
+ font-family: 'yekan';
3
+ src: font-url('/fonts/BYekan.eot');
4
+ src: font-url("/fonts/Yekan.eot#iefix") format('embedded-opentype'),
5
+ font-url("/fonts/Yekan.woff") format('woff'),
6
+ font-url("/fonts/Yekan.ttf") format('truetype');
7
+ }
8
+
9
+
10
+ div, p, h1,h2,h3,h4,h5,h6,a{
11
+ font-family: 'yekan', tahoma;
12
+ }
13
+
14
+ .logo{
15
+ font-family: 'yekan', tahoma !important;
16
+ }
@@ -0,0 +1,11 @@
1
+ #rememberme {
2
+ input {
3
+ display: inline;
4
+ }
5
+ }
6
+
7
+ .form-box {
8
+ .alert {
9
+ margin-left: 0;
10
+ }
11
+ }
@@ -0,0 +1,133 @@
1
+ require_dependency 'underworld/api_controller'
2
+
3
+ module Underworld
4
+ # This class is the base class of all API controllers in any **Underworld**
5
+ # host applications. Each host Rails application should have an `APIController`
6
+ # which inherit from this class.
7
+ class APIController < Underworld::ApplicationController
8
+
9
+ # Only support `json` format
10
+ respond_to :json
11
+
12
+ protect_from_forgery
13
+ skip_before_action :verify_authenticity_token, if: :api_request?
14
+
15
+ # Authenticate user before any action take place
16
+ before_action :authenticate_filter
17
+
18
+ # Check for any presence of filtering query, In querystring and load
19
+ # resource using them
20
+ before_action :load_resource_by_query, :only => [:index]
21
+
22
+ # Set csrf cookie after any action
23
+ after_action :set_csrf_cookie_for_ng
24
+
25
+ # Rescue from any access denied exception raised from cancan and
26
+ # returns a useful error message in json
27
+ # rescue_from CanCan::AccessDenied do |exception|
28
+ # render :status => 403, :json => {
29
+ # :error => t('You don\'t have access to this page'),
30
+ # :orig_msg => exception.message,
31
+ # :action => exception.action
32
+ # }
33
+ # end
34
+
35
+ def set_csrf_cookie_for_ng
36
+ cookies['XSRF-TOKEN'] = form_authenticity_token if protect_against_forgery?
37
+ end
38
+
39
+ # User authentication for API services take place here. By default
40
+ # **Underworld** uses the authentication method of **Devise** to authenticate
41
+ # access to API service.
42
+ #
43
+ # If you want to change authentication method ? just override this method
44
+ # in you **APIController**
45
+ def authenticate_filter
46
+ authenticate_user!
47
+ end
48
+
49
+ # Load resource by using parameters specified in querystring.
50
+ def load_resource_by_query
51
+ # If any query string parameter provided and allow fields specified
52
+ if !request.query_parameters.empty? && !allowed_fields.empty?
53
+
54
+ logger.info ('Load resource by query parameters')
55
+ # Iterate over parameters in query string
56
+ request.query_parameters.each do |key, value|
57
+ # each key can be like filename[__querytype]=value
58
+ # which `querytype` is string that specify the query type scope
59
+ # to use in model. For example these is a query type scope called
60
+ # `gt` which mean the mentioned field should be greater than the
61
+ # value
62
+ field, query_type = key.split('__')
63
+
64
+ if allowed_fields.include? field
65
+ # If field name is in the allowed list
66
+ # If no query type specified we will use assignment scope.
67
+ query_type = 'assignment' if query_type.nil?
68
+
69
+ # If model have an scope with the "#{query_type}_query" name.
70
+ # Otherwise skip
71
+ if model_class.respond_to? "#{query_type}_query"
72
+
73
+ # If resource already loaded. If there was a instnace variable
74
+ # with the plural name of the resource exists then resource
75
+ # already loaded and we should chain new conditions
76
+ if instance_variable_defined? "@#{controller_name}"
77
+ var = instance_variable_get("@#{controller_name}")
78
+ var.send("#{query_type}_query".to_sym, field, value)
79
+ else
80
+ # Resource did not loaded we make first query
81
+ # (without touching database) and set the corresponding
82
+ # instance variables
83
+ relation_object = model_class.send("#{query_type}_query".to_sym,
84
+ field, value)
85
+ instance_variable_set("@#{controller_name}", relation_object)
86
+ end
87
+
88
+ else
89
+ logger.info "There is no `#{query_type}_query` in `#{model_class.to_s}` model."
90
+ end
91
+ else
92
+ logger.warn "`#{field}` in not in allowed list for `#{self.class.to_s}`."
93
+ end
94
+ end
95
+ else
96
+ logger.info('Load resource using `load_resource`')
97
+ #self.class.load_resource
98
+ end
99
+ end
100
+
101
+ # This attribute holds the allowed fileds which we will allow for
102
+ # making query
103
+ def allowed_fields
104
+ return allowed_query_on if self.respond_to?(:allowed_query_on, true)
105
+ @allowed_fields || []
106
+ end
107
+
108
+ # Using this query you can activate the query loading system
109
+ # and specify fields which you want to use in query loading
110
+ def self.allow_query_on(*args)
111
+ #instance_variable_set(:@allowed_fields, args.to_a.collect { |x| x.to_s })
112
+ define_method :allowed_query_on do
113
+ args.to_a.collect { |x| x.to_s }
114
+ end
115
+ private :allowed_query_on
116
+ end
117
+
118
+ protected
119
+
120
+ # Model class related to this controller.
121
+ def model_class
122
+ controller_name.singularize.classify.constantize
123
+ end
124
+
125
+ def verified_request?
126
+ super || form_authenticity_token == request.headers['X-XSRF-TOKEN']
127
+ end
128
+
129
+ def api_request?
130
+ request.format.json?
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,16 @@
1
+ class Underworld::ApplicationController < ActionController::Base
2
+
3
+ include Pundit
4
+
5
+ before_action :set_locale
6
+
7
+ def set_locale
8
+ if I18n.available_locales.length > 1
9
+ lang = request.env['lang'] || params[:locale] || session[:locale] || I18n.default_locale
10
+ else
11
+ lang = I18n.default_locale
12
+ end
13
+
14
+ session[:locale] = I18n.locale = :"#{lang}"
15
+ end
16
+ end
@@ -0,0 +1,6 @@
1
+ class Underworld::AssetsController < ApplicationController
2
+
3
+ include ::AMD::ControllerHelper
4
+ before_action :authenticate_user!
5
+
6
+ end
@@ -0,0 +1,43 @@
1
+ require 'ostruct'
2
+
3
+ module Underworld
4
+ module Dashboard
5
+ class ApplicationController < Underworld::ApplicationController
6
+
7
+ include Underworld::Dashboard::DSL
8
+
9
+ layout 'underworld/dashboard'
10
+
11
+ before_action :authenticate_user!
12
+ before_action :setup_sidebar
13
+ before_action :setup_header
14
+
15
+ rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized
16
+ rescue_from ActiveRecord::RecordNotFound, with: :redirect_to_404
17
+
18
+ protected
19
+
20
+ def setup_header
21
+ @dashboard_section_title = t(controller_name.underscore)
22
+ @dashboard_resource_name = t(controller_name.underscore.singularize)
23
+ @dashboard_section_slug = t(action_name)
24
+ end
25
+
26
+ private
27
+
28
+ def user_not_authorized
29
+ flash[:alert] = t('underworld.not_authorized')
30
+ redirect_to new_user_session_path
31
+ end
32
+
33
+ def redirect_to_404(e)
34
+ logger.warn "Catch and ActiveRecord::RecordNotFoundL: '#{e}'"
35
+
36
+ respond_to do |f|
37
+ f.html { redirect_to underworld.dashboard_not_found_url }
38
+ f.js { render 'underworld/dashboard/not_found' }
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,85 @@
1
+ module Underworld::Dashboard
2
+ class GroupsController < ::Dashboard::ApplicationController
3
+
4
+ before_action :get_all_permissions, only: [:new, :edit]
5
+
6
+ def index
7
+ authorize Underworld::Group
8
+ @groups = Underworld::Group.all
9
+ end
10
+
11
+ def new
12
+ authorize Underworld::Group
13
+ @group = Underworld::Group.new
14
+ end
15
+
16
+
17
+ def edit
18
+ @group = Underworld::Group.find(params[:id])
19
+ authorize @group
20
+ end
21
+
22
+ def create
23
+ authorize Underworld::Group
24
+
25
+ name = group_params[:name]
26
+ @group = Underworld::Group.new(name: name, role: name.underscore)
27
+
28
+ @group.permissions = populate_permissions
29
+
30
+ respond_to do |f|
31
+ if @group.save
32
+ f.js
33
+ f.html
34
+ else
35
+ f.js { render :errors }
36
+ f.html
37
+ end
38
+ end
39
+
40
+ end
41
+
42
+ def update
43
+ @group = Underworld::Group.find(params[:id])
44
+ authorize @group
45
+ @group.permissions = populate_permissions
46
+ @group.name = group_params[:name]
47
+ @group.role = group_params[:name].underscore
48
+
49
+ respond_to do |f|
50
+ if @group.save
51
+ f.js
52
+ f.html
53
+ else
54
+ f.js { render :errors }
55
+ f.html
56
+ end
57
+ end
58
+ end
59
+
60
+ private
61
+
62
+ def populate_permissions
63
+ unless group_params[:permissions].nil?
64
+ # TODO: Fix this for mongoid too.
65
+ ids = group_params[:permissions].keys.map(&:to_i)
66
+ Underworld::Permission.where(id: ids)
67
+ end
68
+ end
69
+
70
+ def group_params
71
+ params.require(:group).permit!
72
+ end
73
+
74
+ def get_all_permissions
75
+ @permissions = {}
76
+ Underworld::Permission.all.each do |perm|
77
+ if @permissions.include? perm.model
78
+ @permissions[perm.model] << [perm.permission_type, perm.id]
79
+ else
80
+ @permissions[perm.model] = [[perm.permission_type, perm.id]]
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,49 @@
1
+ class Underworld::Dashboard::ProfileController < ::ApplicationController
2
+ layout false
3
+ def show
4
+ @user = current_user
5
+ respond_with(@user)
6
+ end
7
+
8
+ def update
9
+ @user = ::Underworld::User.find(current_user.id)
10
+ authorize @user
11
+ respond_to do |f|
12
+ if @user.update_without_password(resource_params)
13
+ f.js { }
14
+ f.html { }
15
+ else
16
+ @errors = @user.errors
17
+ f.js {render :errors}
18
+ f.html
19
+ end
20
+ end
21
+
22
+ end
23
+
24
+
25
+ # GET /sites/new
26
+ def edit_password
27
+ @user = ::Underworld::User.find(current_user.id)
28
+ authorize @user
29
+ end
30
+
31
+ def update_password
32
+ @user = ::Underworld::User.find(current_user.id)
33
+ authorize @user
34
+ respond_to do |f|
35
+ if @user.update_with_password(resource_params)
36
+ f.js { redirect_to new_user_session_path }
37
+ f.html { redirect_to new_user_session_path }
38
+ else
39
+ @errors = @user.errors
40
+ f.js {render :errors}
41
+ f.html
42
+ end
43
+ end
44
+ end
45
+
46
+ def resource_params
47
+ params.require(:user).permit(:password, :current_password, :password_confirmation, :first_name, :last_name, :email)
48
+ end
49
+ end
@@ -0,0 +1,27 @@
1
+ module Underworld::Dashboard
2
+ class UserMessagesController < ::Dashboard::ApplicationController
3
+
4
+ engine 'Underworld::Engine'
5
+
6
+ override_views :show, :new
7
+
8
+ def sent
9
+ authorize model
10
+
11
+ fetch_and_set_all
12
+ action_buttons(index_properties)
13
+
14
+ @_tools_buttons = index_properties.tool_buttons || {}
15
+ @resources = @resources.where(sender: current_user)
16
+
17
+ return if _override_views.include? :index
18
+ render 'underworld/dashboard/resource/index'
19
+ end
20
+
21
+ private
22
+
23
+ def index_hook(resource)
24
+ resource = resource.where(reciver: current_user)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,116 @@
1
+ module Underworld::Dashboard
2
+ class UsersController < ::Dashboard::ApplicationController
3
+
4
+ def index
5
+ authorize Underworld::User
6
+ @users = Underworld::User.all
7
+ end
8
+
9
+ def new
10
+ authorize Underworld::User
11
+ @user = Underworld::User.new
12
+ @groups = Underworld::Group.all
13
+ end
14
+
15
+ def show
16
+ @user = Underworld::User.find(params[:id])
17
+ authorize @user
18
+ end
19
+
20
+ def edit
21
+ @user = Underworld::User.find(params[:id])
22
+ @groups = Underworld::Group.all
23
+ authorize @user
24
+ end
25
+
26
+ def create
27
+
28
+ authorize Underworld::User
29
+ #group_ids = user_params[:groups]
30
+
31
+ parameters = user_params
32
+ groups = parameters.delete(:groups)
33
+ @user = Underworld::User.new(parameters)
34
+ group_ids = groups.map(&:to_i)
35
+ @user.groups = Underworld::Group.where(id: group_ids)
36
+
37
+ respond_to do |f|
38
+ if @user.save
39
+ f.js
40
+ f.html
41
+ else
42
+ f.js { render :errors }
43
+ f.html
44
+ end
45
+ end
46
+ end
47
+
48
+ def update
49
+ parameters = user_params
50
+ groups = parameters.delete(:groups)
51
+
52
+
53
+ @user = Underworld::User.find(params[:id])
54
+ authorize @user
55
+
56
+ unless groups.nil?
57
+ group_ids = groups.map(&:to_i)
58
+ @user.groups = Underworld::Group.where(id: group_ids)
59
+ @user.save
60
+ end
61
+
62
+ respond_to do |f|
63
+ if @user.update_without_password(parameters)
64
+ f.js
65
+ f.html
66
+ else
67
+ f.js { render :errors }
68
+ f.html
69
+ end
70
+ end
71
+ end
72
+
73
+ def edit_password
74
+ @user = Underworld::User.find(params[:id])
75
+ authorize @user, :update?
76
+ end
77
+
78
+ def update_password
79
+ @user = Underworld::User.find(params[:id])
80
+ authorize @user, :update?
81
+
82
+ respond_to do |f|
83
+ if @user.update(password_params)
84
+ f.js
85
+ f.html
86
+ else
87
+ f.js { render :errors }
88
+ f.html
89
+ end
90
+ end
91
+ end
92
+
93
+ def destroy
94
+ @user = Underworld::User.find(params[:id])
95
+ authorize @user
96
+
97
+ @user.destroy
98
+ end
99
+
100
+ private
101
+
102
+ def password_params
103
+ params.require(:user).permit(:password, :password_confirmation)
104
+ end
105
+
106
+ def user_params
107
+ params[:user][:groups] ||= []
108
+ params.require(:user).permit(:first_name,
109
+ :last_name,
110
+ :email,
111
+ :password,
112
+ :password_confirmation,
113
+ :groups => [])
114
+ end
115
+ end
116
+ end