barkest_core 1.5.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (308) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/Gemfile +22 -0
  4. data/Gemfile.lock +254 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.md +364 -0
  7. data/Rakefile +37 -0
  8. data/app/assets/fonts/barkest_core/ArchivoNarrow-Bold.ttf +0 -0
  9. data/app/assets/fonts/barkest_core/ArchivoNarrow-BoldItalic.ttf +0 -0
  10. data/app/assets/fonts/barkest_core/ArchivoNarrow-Italic.ttf +0 -0
  11. data/app/assets/fonts/barkest_core/ArchivoNarrow-Regular.ttf +0 -0
  12. data/app/assets/images/barkest_core/.keep +0 -0
  13. data/app/assets/images/barkest_core/barcode-B.svg +181 -0
  14. data/app/assets/javascripts/barkest_core/.keep +0 -0
  15. data/app/assets/javascripts/barkest_core/application.js +22 -0
  16. data/app/assets/javascripts/barkest_core/bootstrap-datepicker.js +1800 -0
  17. data/app/assets/javascripts/barkest_core/field_init.js +7 -0
  18. data/app/assets/javascripts/barkest_core/jquery.doubleScroll.js +112 -0
  19. data/app/assets/javascripts/barkest_core/masked_edit.js +25 -0
  20. data/app/assets/javascripts/barkest_core/system_status.js.erb +201 -0
  21. data/app/assets/stylesheets/barkest_core/.keep +0 -0
  22. data/app/assets/stylesheets/barkest_core/application.css +17 -0
  23. data/app/assets/stylesheets/barkest_core/custom.css.scss +264 -0
  24. data/app/assets/stylesheets/barkest_core/datepicker3.css +790 -0
  25. data/app/controllers/.keep +0 -0
  26. data/app/controllers/access_groups_controller.rb +74 -0
  27. data/app/controllers/account_activations_controller.rb +29 -0
  28. data/app/controllers/application_controller.rb +5 -0
  29. data/app/controllers/barkest_core/application_controller_base.rb +113 -0
  30. data/app/controllers/barkest_core/engine_controller_base.rb +15 -0
  31. data/app/controllers/barkest_core/testsub_controller.rb +21 -0
  32. data/app/controllers/contact_controller.rb +32 -0
  33. data/app/controllers/log_view_controller.rb +31 -0
  34. data/app/controllers/password_resets_controller.rb +126 -0
  35. data/app/controllers/sessions_controller.rb +64 -0
  36. data/app/controllers/status_controller.rb +150 -0
  37. data/app/controllers/system_config_controller.rb +238 -0
  38. data/app/controllers/system_update_controller.rb +164 -0
  39. data/app/controllers/test_access_controller.rb +44 -0
  40. data/app/controllers/test_report_controller.rb +75 -0
  41. data/app/controllers/users_controller.rb +218 -0
  42. data/app/helpers/.keep +0 -0
  43. data/app/helpers/barkest_core/application_helper.rb +134 -0
  44. data/app/helpers/barkest_core/form_helper.rb +469 -0
  45. data/app/helpers/barkest_core/html_helper.rb +70 -0
  46. data/app/helpers/barkest_core/misc_helper.rb +68 -0
  47. data/app/helpers/barkest_core/pdf_helper.rb +180 -0
  48. data/app/helpers/barkest_core/recaptcha_helper.rb +115 -0
  49. data/app/helpers/barkest_core/sessions_helper.rb +94 -0
  50. data/app/helpers/barkest_core/status_helper.rb +118 -0
  51. data/app/helpers/barkest_core/users_helper.rb +32 -0
  52. data/app/mailers/.keep +0 -0
  53. data/app/mailers/application_mailer.rb +5 -0
  54. data/app/mailers/barkest_core/application_mailer_base.rb +30 -0
  55. data/app/mailers/barkest_core/contact_form.rb +20 -0
  56. data/app/mailers/barkest_core/user_mailer.rb +44 -0
  57. data/app/models/.keep +0 -0
  58. data/app/models/access_group.rb +121 -0
  59. data/app/models/access_group_group_member.rb +13 -0
  60. data/app/models/access_group_user_member.rb +11 -0
  61. data/app/models/barkest_core/auth_config.rb +95 -0
  62. data/app/models/barkest_core/authorize_failure.rb +7 -0
  63. data/app/models/barkest_core/contact_message.rb +37 -0
  64. data/app/models/barkest_core/database_config.rb +223 -0
  65. data/app/models/barkest_core/db_table.rb +21 -0
  66. data/app/models/barkest_core/email_config.rb +132 -0
  67. data/app/models/barkest_core/global_status.rb +267 -0
  68. data/app/models/barkest_core/log_entry.rb +101 -0
  69. data/app/models/barkest_core/log_view_options.rb +51 -0
  70. data/app/models/barkest_core/ms_sql_db_definition.rb +441 -0
  71. data/app/models/barkest_core/ms_sql_definition.rb +221 -0
  72. data/app/models/barkest_core/ms_sql_function.rb +423 -0
  73. data/app/models/barkest_core/not_logged_in.rb +7 -0
  74. data/app/models/barkest_core/pdf_table_builder.rb +407 -0
  75. data/app/models/barkest_core/self_update_config.rb +37 -0
  76. data/app/models/barkest_core/user_alert.rb +29 -0
  77. data/app/models/barkest_core/user_alert_generators.rb +58 -0
  78. data/app/models/barkest_core/user_manager.rb +404 -0
  79. data/app/models/barkest_core/work_path.rb +74 -0
  80. data/app/models/disable_user.rb +18 -0
  81. data/app/models/ldap_access_group.rb +15 -0
  82. data/app/models/system_config.rb +99 -0
  83. data/app/models/user.rb +405 -0
  84. data/app/models/user_login_history.rb +11 -0
  85. data/app/views/.keep +0 -0
  86. data/app/views/access_groups/_form.html.erb +19 -0
  87. data/app/views/access_groups/edit.html.erb +2 -0
  88. data/app/views/access_groups/index.html.erb +32 -0
  89. data/app/views/access_groups/new.html.erb +2 -0
  90. data/app/views/access_groups/show.html.erb +4 -0
  91. data/app/views/barkest_core/contact_form/contact.html.erb +16 -0
  92. data/app/views/barkest_core/contact_form/contact.text.erb +13 -0
  93. data/app/views/barkest_core/testsub/_links.html.erb +5 -0
  94. data/app/views/barkest_core/testsub/page1.html.erb +3 -0
  95. data/app/views/barkest_core/testsub/page2.html.erb +2 -0
  96. data/app/views/barkest_core/testsub/page3.html.erb +2 -0
  97. data/app/views/barkest_core/user_mailer/account_activation.html.erb +7 -0
  98. data/app/views/barkest_core/user_mailer/account_activation.text.erb +6 -0
  99. data/app/views/barkest_core/user_mailer/invalid_password_reset.html.erb +3 -0
  100. data/app/views/barkest_core/user_mailer/invalid_password_reset.text.erb +5 -0
  101. data/app/views/barkest_core/user_mailer/password_reset.html.erb +8 -0
  102. data/app/views/barkest_core/user_mailer/password_reset.text.erb +7 -0
  103. data/app/views/contact/index.html.erb +24 -0
  104. data/app/views/layouts/_footer_copyright.html.erb +1 -0
  105. data/app/views/layouts/_menu_admin.html.erb +5 -0
  106. data/app/views/layouts/_menu_anon.html.erb +0 -0
  107. data/app/views/layouts/_menu_auth.html.erb +3 -0
  108. data/app/views/layouts/_menu_footer.html.erb +1 -0
  109. data/app/views/layouts/_nav_logo.html.erb +1 -0
  110. data/app/views/layouts/application.html.erb +2 -0
  111. data/app/views/layouts/barkest_core/_application.html.erb +24 -0
  112. data/app/views/layouts/barkest_core/_footer.html.erb +18 -0
  113. data/app/views/layouts/barkest_core/_header.html.erb +38 -0
  114. data/app/views/layouts/barkest_core/_html_mailer.html.erb +11 -0
  115. data/app/views/layouts/barkest_core/_menu_account.html.erb +14 -0
  116. data/app/views/layouts/barkest_core/_menu_sample.html.erb +1 -0
  117. data/app/views/layouts/barkest_core/_messages.html.erb +4 -0
  118. data/app/views/layouts/barkest_core/_shim.html.erb +4 -0
  119. data/app/views/layouts/barkest_core/_subheader.html.erb +1 -0
  120. data/app/views/layouts/barkest_core/_text_mailer.text.erb +4 -0
  121. data/app/views/layouts/mailer.html.erb +1 -0
  122. data/app/views/layouts/mailer.text.erb +1 -0
  123. data/app/views/log_view/index.html.erb +100 -0
  124. data/app/views/password_resets/edit.html.erb +20 -0
  125. data/app/views/password_resets/new.html.erb +14 -0
  126. data/app/views/sessions/new.html.erb +27 -0
  127. data/app/views/shared/_error_messages.html.erb +29 -0
  128. data/app/views/shared/_generic_user_alert.html.erb +4 -0
  129. data/app/views/status/current.html.erb +34 -0
  130. data/app/views/status/test.html.erb +50 -0
  131. data/app/views/system_config/index.html.erb +25 -0
  132. data/app/views/system_config/show_auth.html.erb +28 -0
  133. data/app/views/system_config/show_database.html.erb +36 -0
  134. data/app/views/system_config/show_email.html.erb +21 -0
  135. data/app/views/system_config/show_self_update.html.erb +13 -0
  136. data/app/views/system_update/index.html.erb +31 -0
  137. data/app/views/system_update/new.html.erb +2 -0
  138. data/app/views/test_access/allow_anon.html.erb +2 -0
  139. data/app/views/test_access/require_admin.html.erb +2 -0
  140. data/app/views/test_access/require_group_x.html.erb +2 -0
  141. data/app/views/test_access/require_user.html.erb +2 -0
  142. data/app/views/test_report/index.csv.csvrb +23 -0
  143. data/app/views/test_report/index.html.erb +6 -0
  144. data/app/views/test_report/index.pdf.prawn +50 -0
  145. data/app/views/test_report/index.xlsx.axlsx +28 -0
  146. data/app/views/users/_user.html.erb +57 -0
  147. data/app/views/users/_user_details.html.erb +15 -0
  148. data/app/views/users/_user_details_for_list.html.erb +1 -0
  149. data/app/views/users/_user_form.html.erb +13 -0
  150. data/app/views/users/disable_confirm.html.erb +19 -0
  151. data/app/views/users/edit.html.erb +15 -0
  152. data/app/views/users/index.html.erb +9 -0
  153. data/app/views/users/new.html.erb +10 -0
  154. data/app/views/users/show.html.erb +46 -0
  155. data/bin/rails +12 -0
  156. data/config/routes.rb +3 -0
  157. data/db/migrate/20160617172539_create_access_groups.rb +10 -0
  158. data/db/migrate/20160617172725_create_users.rb +26 -0
  159. data/db/migrate/20160617172833_create_user_login_histories.rb +12 -0
  160. data/db/migrate/20160622151720_create_access_group_user_members.rb +9 -0
  161. data/db/migrate/20160622151925_create_access_group_group_members.rb +9 -0
  162. data/db/migrate/20160701005706_create_ldap_access_groups.rb +11 -0
  163. data/db/migrate/20161108155029_create_system_configs.rb +11 -0
  164. data/db/seeds/barkest_core_01_create_users.rb +42 -0
  165. data/db/seeds.rb +53 -0
  166. data/lib/barkest_core/concerns/association_with_defaults.rb +55 -0
  167. data/lib/barkest_core/concerns/boolean_parser.rb +88 -0
  168. data/lib/barkest_core/concerns/date_parser.rb +181 -0
  169. data/lib/barkest_core/concerns/email_tester.rb +55 -0
  170. data/lib/barkest_core/concerns/encrypted_fields.rb +156 -0
  171. data/lib/barkest_core/concerns/named_model.rb +73 -0
  172. data/lib/barkest_core/concerns/number_parser.rb +145 -0
  173. data/lib/barkest_core/concerns/utc_conversion.rb +60 -0
  174. data/lib/barkest_core/engine.rb +105 -0
  175. data/lib/barkest_core/extensions/active_record_extensions.rb +120 -0
  176. data/lib/barkest_core/extensions/application_configuration_extensions.rb +38 -0
  177. data/lib/barkest_core/extensions/application_extensions.rb +50 -0
  178. data/lib/barkest_core/extensions/axlsx_extenstions.rb +157 -0
  179. data/lib/barkest_core/extensions/fixture_set_extensions.rb +107 -0
  180. data/lib/barkest_core/extensions/generator_extensions.rb +271 -0
  181. data/lib/barkest_core/extensions/main_app_extensions.rb +35 -0
  182. data/lib/barkest_core/extensions/prawn_document_extensions.rb +367 -0
  183. data/lib/barkest_core/extensions/prawn_table_extensions.rb +131 -0
  184. data/lib/barkest_core/extensions/router_extensions.rb +106 -0
  185. data/lib/barkest_core/extensions/simple_formatter_extensions.rb +66 -0
  186. data/lib/barkest_core/extensions/test_case_extensions.rb +348 -0
  187. data/lib/barkest_core/extensions/time_extensions.rb +164 -0
  188. data/lib/barkest_core/handlers/csv_handler.rb +30 -0
  189. data/lib/barkest_core/version.rb +3 -0
  190. data/lib/barkest_core.rb +324 -0
  191. data/lib/generators/barkest/install_generator.rb +102 -0
  192. data/lib/generators/barkest_core/actions/01_patch_application_controller.rb +55 -0
  193. data/lib/generators/barkest_core/actions/02_patch_application_mailer.rb +56 -0
  194. data/lib/generators/barkest_core/actions/03_patch_assets.rb +62 -0
  195. data/lib/generators/barkest_core/actions/04_patch_layouts.rb +36 -0
  196. data/lib/generators/barkest_core/actions/05_patch_routes.rb +93 -0
  197. data/lib/generators/barkest_core/actions/06_patch_seeds.rb +60 -0
  198. data/lib/generators/barkest_core/actions/07_copy_migrations.rb +51 -0
  199. data/lib/generators/barkest_core/actions/08_configure_database.rb +52 -0
  200. data/lib/generators/barkest_core/actions/09_configure_secrets.rb +29 -0
  201. data/lib/generators/barkest_core/actions/99_patch_gitignore.rb +57 -0
  202. data/lib/generators/barkest_core/install_generator.rb +17 -0
  203. data/test/barkest_core_test.rb +83 -0
  204. data/test/controllers/access_groups_controller_test.rb +53 -0
  205. data/test/controllers/contact_controller_test.rb +10 -0
  206. data/test/controllers/sessions_controller_test.rb +10 -0
  207. data/test/controllers/users_controller_test.rb +10 -0
  208. data/test/dummy/.gitignore +10 -0
  209. data/test/dummy/README.rdoc +28 -0
  210. data/test/dummy/Rakefile +6 -0
  211. data/test/dummy/app/assets/images/.keep +0 -0
  212. data/test/dummy/app/assets/javascripts/application.js +14 -0
  213. data/test/dummy/app/assets/stylesheets/application.css +16 -0
  214. data/test/dummy/app/controllers/application_controller.rb +5 -0
  215. data/test/dummy/app/controllers/concerns/.keep +0 -0
  216. data/test/dummy/app/helpers/application_helper.rb +2 -0
  217. data/test/dummy/app/mailers/.keep +0 -0
  218. data/test/dummy/app/mailers/application_mailer.rb +3 -0
  219. data/test/dummy/app/models/.keep +0 -0
  220. data/test/dummy/app/models/concerns/.keep +0 -0
  221. data/test/dummy/app/views/layouts/application.html.erb +1 -0
  222. data/test/dummy/app/views/layouts/mailer.html.erb +1 -0
  223. data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
  224. data/test/dummy/app/views/system_config/show_fake.html.erb +3 -0
  225. data/test/dummy/bin/bundle +3 -0
  226. data/test/dummy/bin/rails +4 -0
  227. data/test/dummy/bin/rake +4 -0
  228. data/test/dummy/bin/setup +29 -0
  229. data/test/dummy/config/application.rb +27 -0
  230. data/test/dummy/config/boot.rb +5 -0
  231. data/test/dummy/config/environment.rb +5 -0
  232. data/test/dummy/config/environments/development.rb +47 -0
  233. data/test/dummy/config/environments/production.rb +79 -0
  234. data/test/dummy/config/environments/test.rb +44 -0
  235. data/test/dummy/config/initializers/assets.rb +11 -0
  236. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  237. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  238. data/test/dummy/config/initializers/db_updater_ext.rb +33 -0
  239. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  240. data/test/dummy/config/initializers/inflections.rb +16 -0
  241. data/test/dummy/config/initializers/mime_types.rb +4 -0
  242. data/test/dummy/config/initializers/session_store.rb +3 -0
  243. data/test/dummy/config/initializers/sys_config_ext.rb +12 -0
  244. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  245. data/test/dummy/config/locales/en.yml +23 -0
  246. data/test/dummy/config/routes.rb +60 -0
  247. data/test/dummy/config.ru +4 -0
  248. data/test/dummy/db/schema.rb +95 -0
  249. data/test/dummy/db/seeds/barkest_core_01_create_users.rb +42 -0
  250. data/test/dummy/db/seeds.rb +51 -0
  251. data/test/dummy/lib/assets/.keep +0 -0
  252. data/test/dummy/log/.keep +0 -0
  253. data/test/dummy/public/404.html +67 -0
  254. data/test/dummy/public/422.html +67 -0
  255. data/test/dummy/public/500.html +66 -0
  256. data/test/dummy/public/favicon.ico +0 -0
  257. data/test/dummy/sql/my_test_view.sql +3 -0
  258. data/test/fixtures/access_groups.yml +21 -0
  259. data/test/fixtures/users.yml +71 -0
  260. data/test/helpers/barkest_core/sessions_helper_test.rb +22 -0
  261. data/test/integration/access_group_mgmt_test.rb +33 -0
  262. data/test/integration/access_test.rb +24 -0
  263. data/test/integration/account_activations_access_test.rb +12 -0
  264. data/test/integration/contact_test.rb +98 -0
  265. data/test/integration/extra_partial_test.rb +41 -0
  266. data/test/integration/log_view_access_test.rb +12 -0
  267. data/test/integration/password_resets_test.rb +101 -0
  268. data/test/integration/reports_test.rb +53 -0
  269. data/test/integration/status_access_test.rb +27 -0
  270. data/test/integration/system_config_access_test.rb +24 -0
  271. data/test/integration/system_update_access_test.rb +19 -0
  272. data/test/integration/users_access_test.rb +34 -0
  273. data/test/integration/users_edit_test.rb +178 -0
  274. data/test/integration/users_index_test.rb +62 -0
  275. data/test/integration/users_login_test.rb +67 -0
  276. data/test/integration/users_signup_test.rb +54 -0
  277. data/test/mailers/.keep +0 -0
  278. data/test/mailers/barkest_core/contact_form_test.rb +28 -0
  279. data/test/mailers/barkest_core/user_mailer_test.rb +43 -0
  280. data/test/mailers/previews/barkest_core/contact_form_preview.rb +17 -0
  281. data/test/mailers/previews/barkest_core/user_mailer_preview.rb +26 -0
  282. data/test/models/access_group_group_member_test.rb +28 -0
  283. data/test/models/access_group_test.rb +114 -0
  284. data/test/models/access_group_user_member_test.rb +28 -0
  285. data/test/models/barkest_core/auth_config_test.rb +57 -0
  286. data/test/models/barkest_core/bool_parser_test.rb +28 -0
  287. data/test/models/barkest_core/contact_message_test.rb +61 -0
  288. data/test/models/barkest_core/database_config_test.rb +33 -0
  289. data/test/models/barkest_core/date_parser_test.rb +110 -0
  290. data/test/models/barkest_core/email_config_test.rb +57 -0
  291. data/test/models/barkest_core/global_status_test.rb +50 -0
  292. data/test/models/barkest_core/ms_sql_db_updater_test.rb +115 -0
  293. data/test/models/barkest_core/ms_sql_definition_test.rb +102 -0
  294. data/test/models/barkest_core/ms_sql_function_test.rb +131 -0
  295. data/test/models/barkest_core/number_parser_test.rb +29 -0
  296. data/test/models/barkest_core/self_update_config_test.rb +29 -0
  297. data/test/models/barkest_core/user_alert_test.rb +19 -0
  298. data/test/models/barkest_core/user_manager_test.rb +34 -0
  299. data/test/models/barkest_core/work_path_test.rb +26 -0
  300. data/test/models/disable_user_test.rb +27 -0
  301. data/test/models/generic_time_test.rb +66 -0
  302. data/test/models/ldap_access_group_test.rb +31 -0
  303. data/test/models/pdf_table_builder_test.rb +6 -0
  304. data/test/models/system_config_test.rb +78 -0
  305. data/test/models/user_login_history_test.rb +37 -0
  306. data/test/models/user_test.rb +130 -0
  307. data/test/test_helper.rb +63 -0
  308. metadata +798 -0
@@ -0,0 +1,70 @@
1
+ module BarkestCore
2
+ ##
3
+ # This module contains some helper functions to make generating common HTML elements easier.
4
+ module HtmlHelper
5
+
6
+ ##
7
+ # Creates a glyph icon using the specified +name+ and +size+.
8
+ #
9
+ # The +size+ can be nil, :small, :smaller, :big, or :bigger.
10
+ # The default size is nil.
11
+ def glyph(name, size = nil)
12
+ size = size.to_s.downcase
13
+ if %w(small smaller big bigger).include?(size)
14
+ size = ' glyph-' + size
15
+ else
16
+ size = ''
17
+ end
18
+ "<i class=\"glyphicon glyphicon-#{h name}#{size}\"></i>".html_safe
19
+ end
20
+
21
+ ##
22
+ # Creates a check glyph icon if the +bool_val+ is true.
23
+ #
24
+ # The +size+ can be nil, :small, :smaller, :big, or :bigger.
25
+ # The default +size+ is :small.
26
+ def check_if(bool_val, size = :small)
27
+ glyph(:ok, size) if bool_val
28
+ end
29
+
30
+ ##
31
+ # Creates a panel with the specified title.
32
+ #
33
+ # Valid options:
34
+ # * +type+ can be +primary+, +success+, +info+, +warning+, or +danger+. Default: primary
35
+ # * +size+ can be any value from 1..12. Default: 6
36
+ # * +offset+ can be any value from 0..12. Default: 3
37
+ # * +open_body+ can be true or false. If true, the body division is opened (and closed) by this helper. Default: true
38
+ #
39
+ # Provide a block to render content within the panel.
40
+ def panel(title, options = { }, &block)
41
+ options = {
42
+ type: 'primary',
43
+ size: 6,
44
+ offset: 3,
45
+ open_body: true
46
+ }.merge(options || {})
47
+
48
+ options[:type] = options[:type].to_s.downcase
49
+ options[:type] = 'primary' unless %w(primary success info warning danger).include?(options[:type])
50
+ options[:size] = 6 unless (1..12).include?(options[:size])
51
+ options[:offset] = 3 unless (0..12).include?(options[:offset])
52
+
53
+ ret = "<div class=\"col-md-#{options[:size]} col-md-offset-#{options[:offset]}\"><div class=\"panel panel-#{options[:type]}\"><div class=\"panel-heading\"><h4 class=\"panel-title\">#{h title}</h4></div>"
54
+ ret += '<div class="panel-body">' if options[:open_body]
55
+
56
+ if block_given?
57
+ content = capture { block.call }
58
+ ret += h content.to_s
59
+ end
60
+
61
+ ret += '</div>' if options[:open_body]
62
+ ret += '</div></div>'
63
+
64
+ ret.html_safe
65
+ end
66
+
67
+
68
+ end
69
+
70
+ end
@@ -0,0 +1,68 @@
1
+ module BarkestCore
2
+ ##
3
+ # Contains some miscellaneous helper methods.
4
+ module MiscHelper
5
+
6
+ ##
7
+ # Formats a date in M/D/YYYY format.
8
+ #
9
+ # The +date+ can be either a string already in the correct format, or a Date/Time object.
10
+ # If +date+ is blank or nil, then nil will be returned.
11
+ #
12
+ def fmt_date(date)
13
+ return nil if date.blank?
14
+ return nil unless (date.is_a?(String) || date.is_a?(Date) || date.is_a?(Time))
15
+ unless date.is_a?(String)
16
+ date = date.to_s(:date4)
17
+ end
18
+ m,d,y = date.split('/')
19
+ "#{m.to_i}/#{d.to_i}/#{y.to_i}"
20
+ end
21
+
22
+ ##
23
+ # Formats a number to the specified number of decimal places.
24
+ #
25
+ # The +value+ can be either any valid numeric expression that can be converted to a float.
26
+ #
27
+ def fixed(value, places = 2)
28
+ value = value.to_s.to_f unless value.is_a?(Float)
29
+ sprintf("%0.#{places}f", value.round(places))
30
+ end
31
+
32
+ ##
33
+ # Splits a name into First, Middle, and Last parts.
34
+ #
35
+ # Returns an array containing [ First, Middle, Last ]
36
+ # Any part that is missing will be nil.
37
+ #
38
+ # 'John Doe' => [ 'John', nil, 'Doe' ]
39
+ # 'Doe, John' => [ 'John', nil, 'Doe' ]
40
+ # 'John A. Doe' => [ 'John', 'A.', 'Doe' ]
41
+ # 'Doe, John A.' => [ 'John', 'A.', 'Doe' ]
42
+ # 'John A. Doe Jr.' => [ 'John', 'A.', 'Doe Jr.' ]
43
+ # 'Doe Jr., John A.' => [ 'John', 'A.', 'Doe Jr.' ]
44
+ #
45
+ # Since it doesn't check very hard, there are some known bugs as well.
46
+ #
47
+ # 'John Doe Jr.' => [ 'John', 'Doe', 'Jr.' ]
48
+ # 'John Doe, Jr.' => [ 'Jr.', nil, 'John Doe' ]
49
+ # 'Doe, John A., Jr.' => [ 'John', 'A., Jr.', 'Doe' ]
50
+ #
51
+ # It should work in most cases.
52
+ #
53
+ def split_name(name)
54
+ name ||= ''
55
+ if name.include?(',')
56
+ last,first = name.split(',', 2)
57
+ first,middle = first.to_s.strip.split(' ', 2)
58
+ else
59
+ first,middle,last = name.split(' ', 3)
60
+ if middle && !last
61
+ middle,last = last,middle
62
+ end
63
+ end
64
+ [ first.to_s.strip, middle.to_s.strip, last.to_s.strip ]
65
+ end
66
+
67
+ end
68
+ end
@@ -0,0 +1,180 @@
1
+ require 'prawn-rails/document'
2
+ require 'prawn/measurement_extensions'
3
+ require 'prawn/font'
4
+
5
+ module BarkestCore
6
+ ##
7
+ # This module defines the method that makes PDF generation just a bit easier.
8
+ #
9
+ module PdfHelper
10
+
11
+ ##
12
+ # Creates a PDF document with the specified options.
13
+ #
14
+ # The document will be setup with configured margins, a 100x100 grid, and one embedded font (ArhivoNarrow).
15
+ # Once the document is configured, the +pdf+ will be yielded to the block provided to generate the content.
16
+ #
17
+ # Accepted options:
18
+ #
19
+ # page_layout::
20
+ # Specify the page layout. This can be either :portrait or :landscape. Defaults to :portrait.
21
+ #
22
+ # page_size::
23
+ # Specify the page size. This defaults to 'LETTER'. See {Prawn PDF Manual}[http://prawnpdf.org/manual.pdf#page=91] for more information.
24
+ #
25
+ # margin::
26
+ # Specify the margin size. This can be either a single value or an array of values. Internally it always
27
+ # gets converted to an array of values. If you only specify a single value, it will be filled out as the
28
+ # margin for all four edges. Alternatively, you can set :top_margin, :right_margin, :left_margin, and
29
+ # :bottom_margin individually.
30
+ #
31
+ # top_margin::
32
+ # Specify the top margin size. Defaults to 0.5 in.
33
+ #
34
+ # right_margin::
35
+ # Specify the right margin size. Defaults to 0.5 in.
36
+ #
37
+ # left_margin::
38
+ # Specify the left margin size. Defaults to 0.5 in.
39
+ #
40
+ # bottom_margin::
41
+ # Specify the bottom margin size. Defaults to 0.5 in.
42
+ #
43
+ # print_scaling::
44
+ # Allows you to specify the default print scaling in the print dialog. Defaults to :none.
45
+ # See the {Prawn PDF Manual}[http://prawnpdf.org/manual.pdf#page=95] for more information.
46
+ #
47
+ # font_name::
48
+ # Specify the default font for the document. Can be one of 'Helvetica', 'Times-Roman', 'Courier', or
49
+ # 'ArchivoNarrow'. Defaults to 'Helvetica'.
50
+ #
51
+ # font_size::
52
+ # Specify the default font size for the document. Defaults to 10 pt.
53
+ #
54
+ # skip_footer::
55
+ # Set to true to skip footer generation. Otherwise, once you finish generating content, a footer will
56
+ # be attached to every page automatically.
57
+ #
58
+ # footer_left::
59
+ # Set the left footer text. Defaults to the current user name and time.
60
+ #
61
+ # footer_center::
62
+ # Set the center footer text. Defaults to the request path.
63
+ #
64
+ # footer_right::
65
+ # Set the right footer text. Defaults to "Page # of #".
66
+ #
67
+ # footer_hr::
68
+ # Set to true to draw a horizontal rule above the footer, or false to omit the horizontal rule.
69
+ # Defaults to true.
70
+ #
71
+ # footer_color::
72
+ # Set the color of the footer text. Defaults to '000000' (black).
73
+ #
74
+ def pdf_doc(options = {})
75
+
76
+ # our default values merged with the configured values and then the options provided.
77
+ options = {
78
+ page_layout: :portrait,
79
+ page_size: 'LETTER',
80
+ margin: [ 0.5.in, 0.5.in, 0.55.in, 0.5.in ],
81
+ print_scaling: :none,
82
+ font_name: 'Helvetica',
83
+ font_size: 10.0
84
+ }.merge(PrawnRails.config.to_h).merge(options || {})
85
+
86
+ # build the info
87
+ options[:info] ||= {}
88
+ options[:info].merge!({
89
+ Title: options.delete(:title) || "#{controller_name}##{action_name}",
90
+ Creator: options.delete(:creator) || Rails.application.app_company,
91
+ Producer: options.delete(:producer) || Rails.application.app_info,
92
+ CreationDate: options.delete(:creation_date) || Time.now
93
+ })
94
+
95
+ # build the margin array
96
+ options[:margin] ||= []
97
+ options[:margin] = [ options[:margin] ] * 4 unless options[:margin].is_a?(Array)
98
+
99
+ # top margin defaults to 0.5".
100
+ options[:margin][0] = options[:top_margin] if options[:top_margin]
101
+ options[:margin][0] = 0.5.in unless options[:margin][0]
102
+
103
+ # right margin defaults to top margin.
104
+ options[:margin][1] = options[:right_margin] if options[:right_margin]
105
+ options[:margin][1] = options[:margin][0] unless options[:margin][1]
106
+
107
+ # bottom margin defaults to top margin.
108
+ options[:margin][2] = options[:bottom_margin] if options[:bottom_margin]
109
+ options[:margin][2] = options[:margin][0] unless options[:margin][2]
110
+
111
+ # left margin defaults to right margin.
112
+ options[:margin][3] = options[:left_margin] if options[:left_margin]
113
+ options[:margin][3] = options[:margin][1] unless options[:margin][3]
114
+
115
+ font_name = options[:font_name] || 'Helvetica'
116
+ font_size = options[:font_size] || 10.0
117
+
118
+ skip_footer = options[:skip_footer].nil? ? false : options[:skip_footer]
119
+
120
+ footer_left = options[:footer_left].nil? ? "#{current_user.name} - #{Time.zone.now.strftime('%Y-%m-%d %H:%M:%S')}" : options[:footer_left].to_s
121
+ footer_center = options[:footer_center].nil? ? request.fullpath : options[:footer_center].to_s
122
+ footer_right = options[:footer_right].nil? ? nil : options[:footer_right].to_s
123
+ footer_hr = options[:footer_hr].nil? ? true : options[:footer_hr]
124
+ footer_color = options[:footer_color].nil? ? '000000' : options[:footer_color].to_s
125
+
126
+ # remove some options that are custom.
127
+ options.except!(
128
+ :title, :creator, :producer, :creation_date,
129
+ :top_margin, :bottom_margin, :left_margin, :right_margin,
130
+ :font_name, :font_size,
131
+ :skip_footer
132
+ )
133
+
134
+ left_edge = options[:margin][3]
135
+ right_edge = options[:margin][1]
136
+ bottom_edge = options[:margin][2]
137
+
138
+ pdf = PrawnRails::Document.new(options)
139
+
140
+ # ArchivoNarrow gives us another sans font that has tighter letter spacing, and it is also a freely available font requiring no licensing.
141
+ pdf.font_families['ArchivoNarrow'] = {
142
+ bold: { file: pdf.asset_font_path('barkest_core/ArchivoNarrow-Bold.ttf') },
143
+ italic: { file: pdf.asset_font_path('barkest_core/ArchivoNarrow-Italic.ttf') },
144
+ bold_italic: { file: pdf.asset_font_path('barkest_core/ArchivoNarrow-BoldItalic.ttf') },
145
+ normal: { file: pdf.asset_font_path('barkest_core/ArchivoNarrow-Regular.ttf') },
146
+ }
147
+
148
+ # set the default font and size
149
+ pdf.font font_name, size: font_size
150
+
151
+ # nice fine grid layout.
152
+ pdf.define_grid columns: 100, rows: 100, gutter: 2.5
153
+
154
+ yield pdf if block_given?
155
+
156
+ unless skip_footer
157
+ pdf.font font_name, size: 8.0 do
158
+ (1..pdf.page_count).each do |pg|
159
+ pdf.go_to_page pg
160
+ pdf.canvas do
161
+ width = pdf.bounds.right - right_edge - left_edge
162
+ if footer_hr
163
+ pdf.stroke_color '000000'
164
+ pdf.stroke { pdf.horizontal_line left_edge, pdf.bounds.right - right_edge, at: bottom_edge }
165
+ end
166
+ pos = [ left_edge, bottom_edge - 3 ]
167
+ pdf.bounding_box(pos, width: width, height: 12) { pdf.text pdf.footer_values[0] || footer_left, align: :left, color: footer_color }
168
+ pdf.bounding_box(pos, width: width, height: 12) { pdf.text pdf.footer_values[1] || footer_center, align: :center, color: footer_color }
169
+ pdf.bounding_box(pos, width: width, height: 12) { pdf.text pdf.footer_values[2] || (footer_right || "Page #{pg} of #{pdf.page_count}"), align: :right, color: footer_color }
170
+ end
171
+ end
172
+ end
173
+ end
174
+
175
+ pdf.render
176
+
177
+ end
178
+ end
179
+
180
+ end
@@ -0,0 +1,115 @@
1
+ module BarkestCore
2
+ ##
3
+ # This module makes it easy to work with Google's recaptcha service.
4
+ #
5
+ # Simply add +recaptcha_public_key+ and +recaptch_private_key+ to your
6
+ # +secrets.yml+ configuration file, or provide +RECAPTCHA_PUBLIC_KEY+
7
+ # and +RECAPTCHA_PRIVATE_KEY+ environment variables.
8
+ module RecaptchaHelper
9
+
10
+ private
11
+
12
+ def load_recaptcha_keys
13
+ tmp = ENV['RECAPTCHA_PUBLIC_KEY'].to_s
14
+ @recaptcha_site_key = tmp.blank? ? Rails.application.secrets[:recaptcha_public_key].to_s : tmp
15
+ tmp = ENV['RECAPTCHA_PRIVATE_KEY'].to_s
16
+ @recaptcha_secret_key = tmp.blank? ? Rails.application.secrets[:recaptcha_private_key].to_s : tmp
17
+ end
18
+
19
+ def recaptcha_site_key
20
+ load_recaptcha_keys unless @recaptcha_site_key
21
+ @recaptcha_site_key
22
+ end
23
+
24
+ def recaptcha_secret_key
25
+ load_recaptcha_keys unless @recaptcha_secret_key
26
+ @recaptcha_secret_key
27
+ end
28
+
29
+ def recaptcha_disabled?
30
+ Rails.env.test? || recaptcha_site_key.blank? || recaptcha_secret_key.blank?
31
+ end
32
+
33
+ public
34
+
35
+ ##
36
+ # Adds the recaptcha challenge to a form.
37
+ #
38
+ # This will include the recaptcha API from Google automatically and inserts a +<br>+ sequence after the challenge
39
+ # if +include_break+ is set to true (the default).
40
+ def add_recaptcha_challenge(include_break = true)
41
+ unless recaptcha_disabled?
42
+ "<div class=\"g-recaptcha\" data-sitekey=\"#{h recaptcha_site_key}\"></div>\n<script src=\"https://www.google.com/recaptcha/api.js\"></script>#{include_break ? '<br>' : ''}".html_safe
43
+ end
44
+ end
45
+
46
+ ##
47
+ # Verifies the response from a recaptcha challenge in a controller.
48
+ #
49
+ # It will return true if the recaptcha challenge passed. It always returns true in the 'test' environment.
50
+ #
51
+ # If a +model+ is provided, then an error will be added to the model if the challenge fails.
52
+ # Because this is handled outside of the model (since it's based on the request and not the model),
53
+ # you should first check if the model is valid and then verify the recaptcha challenge to ensure you
54
+ # don't lose the recaptcha error message.
55
+ #
56
+ # if model.valid? && verify_recaptcha_challenge(model)
57
+ # model.save
58
+ # redirect_to :show, id: model
59
+ # else
60
+ # render 'edit'
61
+ # end
62
+ #
63
+ def verify_recaptcha_challenge(model = nil)
64
+
65
+ # always true in tests.
66
+ return true if recaptcha_disabled?
67
+
68
+ # model must respond to the 'errors' message and the result of that must respond to 'add'
69
+ if !model || !model.respond_to?('errors') || !model.send('errors').respond_to?('add')
70
+ model = nil
71
+ end
72
+
73
+ begin
74
+ recaptcha = nil
75
+
76
+ http = Net::HTTP
77
+
78
+ remote_ip = (request.respond_to?('remote_ip') && request.send('remote_ip')) || (env && env['REMOTE_ADDR'])
79
+ verify_hash = {
80
+ secret: recaptcha_secret_key,
81
+ remoteip: remote_ip,
82
+ response: params['g-recaptcha-response']
83
+ }
84
+
85
+ Timeout::timeout(5) do
86
+ uri = URI.parse('https://www.google.com/recaptcha/api/siteverify')
87
+ http_instance = http.new(uri.host, uri.port)
88
+ if uri.port == 443
89
+ http_instance.use_ssl = true
90
+ http_instance.verify_mode = OpenSSL::SSL::VERIFY_NONE
91
+ end
92
+ request = Net::HTTP::Post.new(uri.request_uri)
93
+ request.set_form_data(verify_hash)
94
+ recaptcha = http_instance.request(request)
95
+ end
96
+ answer = JSON.parse(recaptcha.body)
97
+
98
+ if answer['success'].to_s.downcase == 'true'
99
+ return true
100
+ else
101
+ if model
102
+ model.errors.add(:base, 'Recaptcha verification failed.')
103
+ end
104
+ return false
105
+ end
106
+
107
+ rescue Timeout::Error
108
+ if model
109
+ model.errors.add(:base, 'Recaptcha unreachable.')
110
+ end
111
+ end
112
+ end
113
+
114
+ end
115
+ end
@@ -0,0 +1,94 @@
1
+ module BarkestCore
2
+ ##
3
+ # This module adds +log_in+, +log_out+, +current_user+, and other session related helper methods.
4
+ #
5
+ # Based on the tutorial from [www.railstutorial.org](www.railstutorial.org).
6
+ module SessionsHelper
7
+
8
+ ##
9
+ # Logs in the given user.
10
+ def log_in(user)
11
+ session[:user_id] = user.id
12
+ end
13
+
14
+ ##
15
+ # Logs out any currently logged in user.
16
+ def log_out
17
+ forget current_user
18
+ session.delete(:user_id)
19
+ @current_user = nil
20
+ end
21
+
22
+ ##
23
+ # Gets the current user.
24
+ def current_user
25
+ if (user_id = session[:user_id])
26
+ @current_user ||= User.find_by(id: user_id)
27
+ elsif (user_id = cookies.signed[:user_id])
28
+ user = User.find_by(id: user_id)
29
+ if user && user.authenticated?(:remember, cookies[:remember_token])
30
+ log_in user
31
+ @current_user = user
32
+ end
33
+ end
34
+ end
35
+
36
+ ##
37
+ # Is the specified user the current user?
38
+ def current_user?(user)
39
+ user == current_user
40
+ end
41
+
42
+ ##
43
+ # Is the current user a system administrator?
44
+ def system_admin?
45
+ current_user && current_user.system_admin?
46
+ end
47
+
48
+ ##
49
+ # Is a user currently logged in?
50
+ def logged_in?
51
+ !current_user.nil?
52
+ end
53
+
54
+ ##
55
+ # Stores the user id to the permanent cookies to keep the user logged in.
56
+ def remember(user)
57
+ user.remember
58
+ cookies.permanent.signed[:user_id] = user.id
59
+ cookies.permanent[:remember_token] = user.remember_token
60
+ end
61
+
62
+ ##
63
+ # Removes the user from the permanent cookies.
64
+ def forget(user)
65
+ user.forget
66
+ cookies.delete(:user_id)
67
+ cookies.delete(:remember_token)
68
+ end
69
+
70
+ ##
71
+ # A helper redirect method primarily used after logon to redirect to the page that requested a logon.
72
+ #
73
+ # There may be other uses, but logon is the most likely use case.
74
+ def redirect_back_or(default)
75
+ redirect_to(session[:forwarding_url] || default)
76
+ session.delete(:forwarding_url)
77
+ end
78
+
79
+ ##
80
+ # Stores the current request URL to the session for use with +redirect_back_or+.
81
+ #
82
+ def store_location
83
+ session[:forwarding_url] = request.url if request.get?
84
+ end
85
+
86
+ ##
87
+ # Stores the current request URL to the session and redirects to the specified URL.
88
+ def store_location_and_redirect_to(url)
89
+ store_location
90
+ redirect_to url
91
+ end
92
+
93
+ end
94
+ end