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,57 @@
1
+ # == Schema Information
2
+ #
3
+ # Table name: underworld_groups
4
+ #
5
+ # id :integer not null, primary key
6
+ # name :string
7
+ # role :string
8
+ # created_at :datetime
9
+ # updated_at :datetime
10
+ #
11
+
12
+ module Underworld
13
+ # **Group** model for **Underworld** platform
14
+ class Group < ORM.proper_base_class
15
+
16
+ # Make this model authorizable
17
+ include Concerns::Authorizable
18
+
19
+ # Define **Group** fields if current ORM was **Mongoid**
20
+ if ORM.mongoid?
21
+ include Mongoid::Document
22
+ include Mongoid::Timestamps
23
+
24
+ field :name, type: String
25
+ field :role, type: String
26
+ end
27
+
28
+ has_and_belongs_to_many :users, class_name: 'Underworld::User'
29
+ has_and_belongs_to_many :permissions, class_name: 'Underworld::Permission'
30
+
31
+ # Validations
32
+ validates :name, presence: true
33
+ validates :role, presence: true, uniqueness: true
34
+
35
+ def self.policy_class
36
+ GroupPolicy
37
+ end
38
+
39
+ def include_permission?(perm)
40
+ if perm.is_a? Fixnum
41
+ permission_ids.include? perm
42
+ else
43
+ permission_ids.include? perm.id
44
+ end
45
+ end
46
+
47
+ def to_s
48
+ name
49
+ end
50
+
51
+ private
52
+
53
+ def permission_ids
54
+ @permission_ids ||= permissions.map(&:id)
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,43 @@
1
+ # == Schema Information
2
+ #
3
+ # Table name: underworld_permissions
4
+ #
5
+ # id :integer not null, primary key
6
+ # model :string
7
+ # permission_type :string
8
+ # created_at :datetime
9
+ # updated_at :datetime
10
+ #
11
+
12
+ module Underworld
13
+ class Permission < ORM.proper_base_class
14
+
15
+ if ::Underworld::ORM.mongoid?
16
+ include Mongoid::Document
17
+ include Mongoid::Timestamps
18
+
19
+ field :model, type: String
20
+ field :permission_type, type: String
21
+
22
+ end
23
+
24
+ has_and_belongs_to_many :groups, class_name: 'Underworld::Group'
25
+ alias_attribute :action, :permission_type
26
+
27
+ #alias_method :action, :permission_type
28
+
29
+ def to_s
30
+ t('permission_string', action: t(self.permission_type.to_s),
31
+ model: t(self.model.underscore.humanize))
32
+ end
33
+
34
+ def id_repr
35
+ "#{self.permission_type.to_s}|#{self.model}"
36
+ end
37
+
38
+ def model_name
39
+ model.underscore.humanize
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,81 @@
1
+ # == Schema Information
2
+ #
3
+ # Table name: underworld_users
4
+ #
5
+ # id :integer not null, primary key
6
+ # email :string default(""), not null
7
+ # encrypted_password :string default(""), not null
8
+ # reset_password_token :string
9
+ # reset_password_sent_at :datetime
10
+ # remember_created_at :datetime
11
+ # sign_in_count :integer default("0")
12
+ # current_sign_in_at :datetime
13
+ # last_sign_in_at :datetime
14
+ # current_sign_in_ip :string
15
+ # last_sign_in_ip :string
16
+ # first_name :string
17
+ # last_name :string
18
+ # group_id :integer default("2")
19
+ # failed_attempts :integer default("0")
20
+ # unlock_token :string
21
+ # locked_at :datetime
22
+ # created_at :datetime
23
+ # updated_at :datetime
24
+ #
25
+
26
+ module Underworld
27
+ # **User** model for **Underworld** platform
28
+ class User < ORM.proper_base_class
29
+
30
+ # Define **User** fields if current ORM was Mongoid -----------------------
31
+ if Underworld::ORM.mongoid?
32
+ include Mongoid::Document
33
+ include Mongoid::Timestamps
34
+ include Underworld::Concerns::User::MongoidFields
35
+ end
36
+
37
+ # Callbacks ---------------------------------------------------------------
38
+ before_create :join_guests
39
+
40
+ # AuthDefinitions contains all the **Devise** related configurations.
41
+ include Underworld::Concerns::User::AuthDefinitions
42
+ # Permission related methods for user
43
+ include Underworld::Concerns::User::Permission
44
+ # Roles related methods for user
45
+ include Underworld::Concerns::User::UserRoles
46
+
47
+ # Gravatar
48
+ include Underworld::Concerns::User::Gravatar
49
+
50
+ # Make this model authorizable
51
+ include Underworld::Concerns::Authorizable
52
+
53
+ has_and_belongs_to_many :groups, class_name: 'Underworld::Group', uniq: true
54
+
55
+ # Validations
56
+ validates :password, presence: true, length: { minimum: 5, maximum: 120 }, on: :create
57
+ validates :password, length: { minimum: 5, maximum: 120 }, on: :update, allow_blank: true
58
+ validates :email, format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i, on: :create }
59
+
60
+ devise *@@devise_options
61
+
62
+ # It's totally obviuse. Join the guest group if no group provided
63
+ def join_guests
64
+ #::Underworld::Group.find_by(role: 'guest')
65
+ if groups.empty?
66
+ guest_group = ::Underworld::Group.find_or_create_by(name: 'Guest',
67
+ role: 'guest')
68
+ self.groups << guest_group
69
+ end
70
+ end
71
+
72
+ def self.policy_class
73
+ Underworld::UserPolicy
74
+ end
75
+
76
+ def to_s
77
+ full_name || email
78
+ end
79
+
80
+ end
81
+ end
@@ -0,0 +1,6 @@
1
+ module Underworld
2
+ class UserMessage < ActiveRecord::Base
3
+ belongs_to :sender, class_name: 'Underworld::User'
4
+ belongs_to :reciever, class_name: 'Underworld::User'
5
+ end
6
+ end
@@ -0,0 +1,66 @@
1
+ # This class grant admin access only.
2
+ # This can be a good base class for your resource
3
+ # if you want to give access to admin only
4
+ class Underworld::AdminOnlyPolicy
5
+ attr_reader :user, :record
6
+
7
+ def initialize(user, record)
8
+ @user = user
9
+ @record = record
10
+ end
11
+
12
+ def index?
13
+ return false if @user.nil?
14
+ return true if @user.admin?
15
+ false
16
+ end
17
+
18
+ def show?
19
+ return false if @user.nil?
20
+ return true if @user.admin?
21
+ false
22
+ end
23
+
24
+ def create?
25
+ return false if @user.nil?
26
+ return true if @user.admin?
27
+ false
28
+ end
29
+
30
+ def new?
31
+ create?
32
+ end
33
+
34
+ def update?
35
+ return false if @user.nil?
36
+ return true if @user.admin?
37
+ false
38
+ end
39
+
40
+ def edit?
41
+ update?
42
+ end
43
+
44
+ def destroy?
45
+ return false if @user.nil?
46
+ return true if @user.admin?
47
+ false
48
+ end
49
+
50
+ def scope
51
+ Pundit.policy_scope!(@user, record.class)
52
+ end
53
+
54
+ class Scope
55
+ attr_reader :user, :scope
56
+
57
+ def initialize(user, scope)
58
+ @@user = @user
59
+ @scope = scope
60
+ end
61
+
62
+ def resolve
63
+ scope
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,55 @@
1
+ # Main class for all the **Underworld** Policy classes.
2
+ # It's totally a minimume Policy.
3
+ class Underworld::ApplicationPolicy
4
+ attr_reader :user, :record
5
+
6
+ def initialize(user, record)
7
+ @user = user
8
+ @record = record
9
+ end
10
+
11
+ def authorize?(action)
12
+ return false if @user.nil?
13
+ return true if @user.admin?
14
+
15
+ # Check for ownership of the reocrd
16
+ record_class = @record.class
17
+
18
+ unless [Class, String, Symbol].include?(record_class)
19
+ if @user.has_ownership?(@record)
20
+ return false if !@user.owned? @record
21
+ end
22
+ @record = @record.class
23
+ end
24
+
25
+ user.can? action, @record.to_s
26
+ end
27
+
28
+ def method_missing(m, *args, &block_given)
29
+ return authorize? m.to_s[0..-2] if m.to_s =~ /.*\?$/
30
+ super
31
+ end
32
+
33
+
34
+ def scope
35
+ Pundit.policy_scope!(@user, record.class)
36
+ end
37
+
38
+ class Scope
39
+ attr_reader :user, :scope
40
+
41
+ def initialize(user, scope)
42
+ @user = user
43
+ @scope = scope
44
+ end
45
+
46
+ def resolve
47
+ if @user.has_ownership?(scope)
48
+ scope.where(user: @user)
49
+ else
50
+ scope
51
+ end
52
+ end
53
+ end
54
+
55
+ end
@@ -0,0 +1,8 @@
1
+ class Underworld::GroupPolicy < Underworld::ApplicationPolicy
2
+
3
+ class Scope < Scope
4
+ def resolve
5
+ scope
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ module Underworld
2
+ class UserMessagePolicy < ApplicationPolicy
3
+ class Scope < Scope
4
+ def resolve
5
+ scope
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Underworld
2
+ class UserPolicy < ApplicationPolicy
3
+ class Scope < Scope
4
+ def resolve
5
+ scope
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,2 @@
1
+ <h1>TODO: You have to either use a template gem like 'dashstrap' or override this templates in your code base</h1>
2
+ <h2>/auth/groups/details</h2>
@@ -0,0 +1,2 @@
1
+ <h1>TODO: You have to either use a template gem like 'dashstrap' or override this templates in your code base</h1>
2
+ <h2>/auth/groups/index</h2>
@@ -0,0 +1,2 @@
1
+ <h1>TODO: You have to either use a template gem like 'dashstrap' or override this templates in your code base</h1>
2
+ <h2>/auth/groups/new</h2>
@@ -0,0 +1,30 @@
1
+ <div class="row clearmargin">
2
+
3
+ <div class="columns large-5 small-offset-1 clearpadding">
4
+
5
+ <a href="#/auth/users">
6
+ <div class="widget red">
7
+ <div class="text-center">
8
+ <span class="icon text-4x"><i class="fa fa-user"></i></span>
9
+ <span class="text-2x" translate>Users</span>
10
+ </div>
11
+
12
+ </div>
13
+ </a>
14
+
15
+ </div>
16
+
17
+
18
+ <div class="columns large-5 clearpadding">
19
+
20
+ <a href="#/auth/groups">
21
+ <div class="widget blue">
22
+ <div class=" text-center">
23
+ <span class="icon text-4x"><i class="fa fa-group"></i></span>
24
+ <span class="text-2x" translate>Groups</span>
25
+ </div>
26
+ </div>
27
+ </a>
28
+ </div>
29
+
30
+ </div>
@@ -0,0 +1,54 @@
1
+ <div class="newform">
2
+ <fieldset class="form">
3
+
4
+ <legend translate>Edit Profile</legend>
5
+
6
+ <div class="row">
7
+ <div class="small-4 columns">
8
+ <label for="first_name" translate>First Name :</label>
9
+ <input id="id_first_name" type="text" name="first_name" required ng-model="first_name" required>
10
+ <small id="id_first_name_msg"></small>
11
+ </div>
12
+
13
+ <div class="small-4 columns float-left small-offset-2">
14
+ <label for="last_name" translate>Last Name :</label>
15
+ <input id="id_last_name" type="text" name="last_name" required ng-model="last_name">
16
+ <small id="id_last_name_msg"></small>
17
+
18
+ </div>
19
+ </div>
20
+
21
+ <div class="row">
22
+ <div class="small-4 columns">
23
+ <label for="password" translate>Password :</label>
24
+ <input id="id_password" type="password" name="password" required ng-model="password" required>
25
+ <small id="id_first_name_msg"></small>
26
+ </div>
27
+
28
+ <div class="small-4 columns float-left small-offset-2">
29
+ <label for="password_confirmation" translate>Confirm Password :</label>
30
+ <input id="id_password_confirmation" type="password" name="password_confirmation" required ng-model="password_confirmation">
31
+ <small id="id_password_confirmation_msg"></small>
32
+
33
+ </div>
34
+ </div>
35
+ <div class="row">
36
+
37
+ <div class="small-4 columns">
38
+ <label for="email" translate>E-mail :</label>
39
+ <input id="id_email" type="email" name="email" required ng-model="email">
40
+ <small id="id_email_msg"></small>
41
+
42
+ </div>
43
+ </div>
44
+
45
+ </fieldset>
46
+
47
+ <div class="row">
48
+ <div class="small-4 columns">
49
+ <button ng-click="save()" class="btn small green" ng-disabled="form.first_name.$pristine || form.first_name.$dirty && form.fist_name.$invalid"><i class="fa fa-check"></i> <span translate>Save</span></button>
50
+ <button ng-click="cancel()" class="btn small red"><i class="fa fa-times"></i> <span translate>Cancel</span></button>
51
+ </div>
52
+ </div>
53
+
54
+ </div>
@@ -0,0 +1,28 @@
1
+ <div class="details">
2
+ <p >
3
+ <b translate>First Name :</b>{{this.object.first_name}}
4
+ </p>
5
+
6
+ <p>
7
+ <b translate>Last Name :</b>{{this.object.last_name}}
8
+ </p>
9
+
10
+ <p>
11
+ <b translate>E-mail :</b>{{this.object.email}}
12
+ </p>
13
+ <p>
14
+ <b translate>Group :</b>{{this.object.group.name}}
15
+ </p>
16
+
17
+ <ul class="button-group float-right">
18
+ <a href="#/auth/users/{{this.object.id}}/reply" class="small">
19
+ <span class="fa fa-edit"></span> <span translated>Edit</span>
20
+ </a>
21
+ <a href="" class="small">
22
+ <span class="fa fa-eye"></span><span translated>Show</span>
23
+ </a>
24
+ <a href="" class="small">
25
+ <span class="fa fa-check-circle-o"></span><span translated>Active</span>
26
+ </a>
27
+ </ul>
28
+ </div>