fat_free_crm 0.18.2 → 0.19.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of fat_free_crm might be problematic. Click here for more details.

Files changed (251) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +61 -160
  3. data/.travis.yml +27 -11
  4. data/CHANGELOG.md +40 -24
  5. data/CONTRIBUTORS.md +1 -0
  6. data/Dockerfile +45 -14
  7. data/Gemfile +16 -10
  8. data/Gemfile.lock +230 -222
  9. data/Procfile +1 -1
  10. data/README.md +2 -2
  11. data/Rakefile +1 -1
  12. data/app/assets/stylesheets/common.scss +1 -1
  13. data/app/controllers/admin/application_controller.rb +1 -1
  14. data/app/controllers/admin/field_groups_controller.rb +1 -3
  15. data/app/controllers/admin/tags_controller.rb +1 -3
  16. data/app/controllers/admin/users_controller.rb +5 -8
  17. data/app/controllers/application_controller.rb +11 -45
  18. data/app/controllers/comments_controller.rb +2 -5
  19. data/{config/initializers/authlogic.rb → app/controllers/confirmations_controller.rb} +4 -2
  20. data/app/controllers/emails_controller.rb +0 -2
  21. data/app/controllers/entities/accounts_controller.rb +1 -3
  22. data/app/controllers/entities/campaigns_controller.rb +1 -3
  23. data/app/controllers/entities/contacts_controller.rb +4 -24
  24. data/app/controllers/entities/leads_controller.rb +7 -10
  25. data/app/controllers/entities/opportunities_controller.rb +4 -14
  26. data/app/controllers/entities_controller.rb +21 -7
  27. data/app/controllers/home_controller.rb +2 -4
  28. data/app/controllers/passwords_controller.rb +3 -59
  29. data/{spec/features/support/maintain_sessions.rb → app/controllers/registrations_controller.rb} +12 -5
  30. data/{lib/development_tasks/gem.rake → app/controllers/sessions_controller.rb} +6 -6
  31. data/app/controllers/tasks_controller.rb +8 -17
  32. data/app/controllers/users_controller.rb +8 -29
  33. data/app/helpers/admin/users_helper.rb +1 -1
  34. data/app/helpers/application_helper.rb +27 -32
  35. data/app/helpers/campaigns_helper.rb +1 -1
  36. data/app/helpers/contacts_helper.rb +1 -3
  37. data/app/helpers/opportunities_helper.rb +4 -12
  38. data/app/helpers/tasks_helper.rb +1 -1
  39. data/app/helpers/users_helper.rb +1 -3
  40. data/{config/initializers/paper_trail.rb → app/mailers/devise_mailer.rb} +5 -1
  41. data/app/mailers/user_mailer.rb +0 -9
  42. data/app/models/entities/account.rb +10 -10
  43. data/app/models/entities/campaign.rb +4 -6
  44. data/app/models/entities/contact.rb +24 -12
  45. data/app/models/entities/lead.rb +7 -7
  46. data/app/models/entities/opportunity.rb +7 -9
  47. data/app/models/fields/custom_field.rb +1 -0
  48. data/app/models/fields/custom_field_date_pair.rb +2 -0
  49. data/app/models/fields/field.rb +1 -3
  50. data/app/models/list.rb +1 -1
  51. data/app/models/observers/entity_observer.rb +3 -7
  52. data/app/models/observers/lead_observer.rb +2 -4
  53. data/app/models/observers/opportunity_observer.rb +2 -4
  54. data/app/models/observers/task_observer.rb +1 -1
  55. data/app/models/polymorphic/email.rb +2 -2
  56. data/app/models/polymorphic/task.rb +13 -9
  57. data/app/models/polymorphic/version.rb +3 -2
  58. data/app/models/setting.rb +2 -0
  59. data/app/models/users/permission.rb +3 -3
  60. data/app/models/users/preference.rb +2 -1
  61. data/app/models/users/user.rb +67 -42
  62. data/app/views/accounts/_top_section.html.haml +1 -1
  63. data/app/views/accounts/edit.js.haml +1 -1
  64. data/app/views/accounts/update.js.haml +2 -2
  65. data/app/views/admin/users/_user.html.haml +4 -4
  66. data/app/views/contacts/_index_brief.html.haml +1 -1
  67. data/app/views/contacts/_index_full.html.haml +1 -1
  68. data/app/views/contacts/_index_long.html.haml +1 -1
  69. data/app/views/devise/confirmations/new.html.haml +9 -0
  70. data/app/views/devise/mailer/confirmation_instructions.html.haml +4 -0
  71. data/app/views/devise/mailer/password_change.html.haml +3 -0
  72. data/app/views/devise/mailer/reset_password_instructions.html.haml +6 -0
  73. data/app/views/devise/passwords/edit.html.haml +18 -0
  74. data/app/views/devise/passwords/new.html.haml +10 -0
  75. data/app/views/devise/registrations/new.html.haml +21 -0
  76. data/app/views/devise/sessions/new.html.haml +32 -0
  77. data/app/views/layouts/_about.html.haml +5 -5
  78. data/app/views/layouts/_header.html.haml +3 -3
  79. data/app/views/layouts/admin/_header.html.haml +1 -1
  80. data/app/views/shared/_address.html.haml +5 -5
  81. data/app/views/shared/_paginate_with_per_page.html.haml +1 -0
  82. data/app/views/users/_avatar.html.haml +1 -1
  83. data/bin/bundle +1 -1
  84. data/bin/rails +1 -1
  85. data/bin/setup +38 -0
  86. data/bin/update +33 -0
  87. data/bin/yarn +13 -0
  88. data/config/application.rb +8 -6
  89. data/config/boot.rb +1 -1
  90. data/config/brakeman.ignore +2 -2
  91. data/config/database.postgres.docker.yml +5 -5
  92. data/config/environment.rb +1 -1
  93. data/config/environments/development.rb +1 -0
  94. data/config/environments/test.rb +7 -0
  95. data/config/initializers/action_mailer.rb +1 -3
  96. data/config/initializers/application_controller_renderer.rb +9 -0
  97. data/config/initializers/assets.rb +6 -11
  98. data/config/initializers/backtrace_silencers.rb +0 -6
  99. data/config/initializers/content_security_policy.rb +26 -0
  100. data/config/initializers/cookies_serializer.rb +3 -6
  101. data/config/initializers/devise.rb +289 -0
  102. data/config/initializers/filter_parameter_logging.rb +0 -5
  103. data/config/initializers/gravatar.rb +0 -1
  104. data/config/initializers/inflections.rb +0 -6
  105. data/config/initializers/mime_types.rb +1 -9
  106. data/config/initializers/new_framework_defaults_5_2.rb +40 -0
  107. data/config/initializers/relative_url_root.rb +1 -3
  108. data/config/initializers/session_store.rb +1 -3
  109. data/config/initializers/wrap_parameters.rb +4 -9
  110. data/config/locales/fat_free_crm.en-GB.yml +5 -5
  111. data/config/locales/fat_free_crm.en-US.yml +5 -5
  112. data/config/locales/fat_free_crm.fr.yml +1 -1
  113. data/config/locales/fat_free_crm.ru.yml +1 -0
  114. data/config/routes.rb +20 -9
  115. data/db/demo/users.yml +62 -81
  116. data/db/migrate/20100928030620_remove_uuid.rb +1 -2
  117. data/db/migrate/20120316045804_activities_to_versions.rb +1 -0
  118. data/db/migrate/20120510025219_add_not_null_constraints_for_timestamp_columns.rb +1 -0
  119. data/db/migrate/20180107082701_authlogic_to_devise.rb +58 -0
  120. data/db/schema.rb +48 -43
  121. data/docker-compose.yml +10 -0
  122. data/fat_free_crm.gemspec +11 -13
  123. data/lib/development_tasks/license.rake +2 -2
  124. data/lib/fat_free_crm/callback.rb +2 -2
  125. data/lib/fat_free_crm/comment_extensions.rb +2 -4
  126. data/lib/fat_free_crm/core_ext/string.rb +1 -1
  127. data/lib/fat_free_crm/engine.rb +1 -1
  128. data/lib/fat_free_crm/errors.rb +1 -1
  129. data/lib/fat_free_crm/export_csv.rb +1 -0
  130. data/lib/fat_free_crm/exportable.rb +1 -1
  131. data/lib/fat_free_crm/fields.rb +1 -1
  132. data/lib/fat_free_crm/gem_dependencies.rb +1 -1
  133. data/lib/fat_free_crm/gem_ext/simple_form/action_view_extensions/form_helper.rb +1 -3
  134. data/lib/fat_free_crm/i18n.rb +2 -2
  135. data/lib/fat_free_crm/mail_processor/base.rb +4 -10
  136. data/lib/fat_free_crm/mail_processor/dropbox.rb +5 -15
  137. data/lib/fat_free_crm/permissions.rb +7 -4
  138. data/lib/fat_free_crm/sortable.rb +1 -1
  139. data/lib/fat_free_crm/tabs.rb +2 -2
  140. data/lib/fat_free_crm/version.rb +2 -2
  141. data/lib/gravatar_image_tag.rb +7 -8
  142. data/lib/missing_translation_detector.rb +1 -0
  143. data/lib/tasks/ffcrm/missing_translations.rake +1 -0
  144. data/lib/tasks/ffcrm/setup.rake +10 -1
  145. data/lib/tasks/ffcrm/update_data.rake +2 -2
  146. data/script/rails +2 -2
  147. data/spec/controllers/admin/users_controller_spec.rb +0 -56
  148. data/spec/controllers/comments_controller_spec.rb +6 -6
  149. data/spec/controllers/entities/campaigns_controller_spec.rb +1 -1
  150. data/spec/controllers/entities/contacts_controller_spec.rb +2 -1
  151. data/spec/controllers/entities/leads_controller_spec.rb +2 -2
  152. data/spec/controllers/entities/opportunities_controller_spec.rb +1 -1
  153. data/spec/controllers/entities_controller_spec.rb +5 -0
  154. data/spec/controllers/home_controller_spec.rb +5 -5
  155. data/spec/controllers/tasks_controller_spec.rb +6 -4
  156. data/spec/controllers/users_controller_spec.rb +28 -98
  157. data/spec/factories/account_factories.rb +5 -5
  158. data/spec/factories/campaign_factories.rb +3 -3
  159. data/spec/factories/contact_factories.rb +8 -8
  160. data/spec/factories/field_factories.rb +4 -3
  161. data/spec/factories/lead_factories.rb +5 -5
  162. data/spec/factories/list_factories.rb +2 -2
  163. data/spec/factories/opportunity_factories.rb +3 -3
  164. data/spec/factories/setting_factories.rb +2 -2
  165. data/spec/factories/shared_factories.rb +11 -9
  166. data/spec/factories/task_factories.rb +7 -7
  167. data/spec/factories/user_factories.rb +16 -19
  168. data/spec/features/admin/groups_spec.rb +1 -1
  169. data/spec/features/admin/users_spec.rb +3 -1
  170. data/spec/features/campaigns_spec.rb +1 -1
  171. data/spec/features/contacts_spec.rb +1 -1
  172. data/spec/features/dashboard_spec.rb +1 -1
  173. data/spec/features/devise/sign_in_spec.rb +58 -0
  174. data/spec/features/devise/sign_up_spec.rb +36 -0
  175. data/spec/features/leads_spec.rb +1 -1
  176. data/spec/features/opportunities_overview_spec.rb +1 -1
  177. data/spec/features/opportunities_spec.rb +3 -3
  178. data/spec/features/support/browser.rb +2 -1
  179. data/spec/features/tasks_spec.rb +1 -1
  180. data/spec/helpers/admin/field_groups_helper_spec.rb +1 -1
  181. data/spec/helpers/users_helper_spec.rb +4 -4
  182. data/spec/lib/comment_extensions_spec.rb +10 -4
  183. data/spec/lib/errors_spec.rb +2 -2
  184. data/spec/lib/mail_processor/dropbox_spec.rb +1 -1
  185. data/spec/lib/mail_processor/sample_emails/dropbox.rb +8 -8
  186. data/spec/lib/permissions_spec.rb +8 -3
  187. data/spec/mailers/devise_mailer_spec.rb +35 -0
  188. data/spec/mailers/user_mailer_spec.rb +0 -26
  189. data/spec/models/entities/account_spec.rb +27 -0
  190. data/spec/models/entities/contact_spec.rb +96 -1
  191. data/spec/models/fields/custom_field_date_pair_spec.rb +4 -2
  192. data/spec/models/fields/custom_field_spec.rb +4 -2
  193. data/spec/models/observers/entity_observer_spec.rb +1 -1
  194. data/spec/models/polymorphic/version_spec.rb +7 -7
  195. data/spec/models/users/user_spec.rb +22 -26
  196. data/spec/routing/users_routing_spec.rb +30 -8
  197. data/spec/shared/controllers.rb +3 -9
  198. data/spec/spec_helper.rb +10 -2
  199. data/spec/support/assert_select.rb +1 -0
  200. data/spec/support/devise_helpers.rb +28 -0
  201. data/spec/{features/support/helpers.rb → support/feature_helpers.rb} +10 -10
  202. data/spec/support/macros.rb +4 -1
  203. data/spec/views/contacts/update.js.haml_spec.rb +1 -1
  204. data/spec/views/opportunities/update.js.haml_spec.rb +1 -1
  205. data/vendor/gems/ransack_ui-1.3.4/.gitignore +17 -0
  206. data/vendor/gems/ransack_ui-1.3.4/Gemfile +7 -0
  207. data/vendor/gems/ransack_ui-1.3.4/LICENSE.txt +22 -0
  208. data/vendor/gems/ransack_ui-1.3.4/README.md +57 -0
  209. data/vendor/gems/ransack_ui-1.3.4/Rakefile +1 -0
  210. data/vendor/gems/ransack_ui-1.3.4/app/assets/images/ransack_ui/calendar.png +0 -0
  211. data/vendor/gems/ransack_ui-1.3.4/app/assets/images/ransack_ui/delete.png +0 -0
  212. data/vendor/gems/ransack_ui-1.3.4/app/assets/javascripts/ransack/predicates.js.coffee +41 -0
  213. data/vendor/gems/ransack_ui-1.3.4/app/assets/javascripts/ransack_ui_bootstrap/button_group_select.js.coffee +26 -0
  214. data/vendor/gems/ransack_ui-1.3.4/app/assets/javascripts/ransack_ui_bootstrap/index.js.coffee +2 -0
  215. data/vendor/gems/ransack_ui-1.3.4/app/assets/javascripts/ransack_ui_jquery/index.js +2 -0
  216. data/vendor/gems/ransack_ui-1.3.4/app/assets/javascripts/ransack_ui_jquery/search_form.js.coffee.erb +499 -0
  217. data/vendor/gems/ransack_ui-1.3.4/app/assets/stylesheets/ransack_ui_bootstrap/index.css +3 -0
  218. data/vendor/gems/ransack_ui-1.3.4/app/assets/stylesheets/ransack_ui_bootstrap/search.css.scss +41 -0
  219. data/vendor/gems/ransack_ui-1.3.4/app/views/ransack_ui/_condition_fields.html.erb +15 -0
  220. data/vendor/gems/ransack_ui-1.3.4/app/views/ransack_ui/_grouping_fields.html.erb +16 -0
  221. data/vendor/gems/ransack_ui-1.3.4/app/views/ransack_ui/_search.html.erb +29 -0
  222. data/vendor/gems/ransack_ui-1.3.4/app/views/ransack_ui/_sort_fields.html.erb +4 -0
  223. data/vendor/gems/ransack_ui-1.3.4/config/locales/en.yml +24 -0
  224. data/vendor/gems/ransack_ui-1.3.4/lib/ransack_ui.rb +9 -0
  225. data/vendor/gems/ransack_ui-1.3.4/lib/ransack_ui/adapters/active_record.rb +6 -0
  226. data/vendor/gems/ransack_ui-1.3.4/lib/ransack_ui/adapters/active_record/base.rb +46 -0
  227. data/vendor/gems/ransack_ui-1.3.4/lib/ransack_ui/controller_helpers.rb +18 -0
  228. data/vendor/gems/ransack_ui-1.3.4/lib/ransack_ui/rails/engine.rb +21 -0
  229. data/vendor/gems/ransack_ui-1.3.4/lib/ransack_ui/ransack_overrides/adapters/active_record/base.rb +47 -0
  230. data/vendor/gems/ransack_ui-1.3.4/lib/ransack_ui/ransack_overrides/configuration.rb +15 -0
  231. data/vendor/gems/ransack_ui-1.3.4/lib/ransack_ui/ransack_overrides/context.rb +9 -0
  232. data/vendor/gems/ransack_ui-1.3.4/lib/ransack_ui/ransack_overrides/helpers/form_builder.rb +262 -0
  233. data/vendor/gems/ransack_ui-1.3.4/lib/ransack_ui/ransack_overrides/nodes/attribute.rb +13 -0
  234. data/vendor/gems/ransack_ui-1.3.4/lib/ransack_ui/ransack_overrides/nodes/condition.rb +13 -0
  235. data/vendor/gems/ransack_ui-1.3.4/lib/ransack_ui/ransack_overrides/nodes/grouping.rb +20 -0
  236. data/vendor/gems/ransack_ui-1.3.4/lib/ransack_ui/version.rb +3 -0
  237. data/vendor/gems/ransack_ui-1.3.4/lib/ransack_ui/view_helpers.rb +30 -0
  238. data/vendor/gems/ransack_ui-1.3.4/ransack_ui.gemspec +23 -0
  239. metadata +79 -67
  240. data/app/controllers/authentications_controller.rb +0 -53
  241. data/app/models/users/authentication.rb +0 -56
  242. data/app/views/authentications/new.html.haml +0 -19
  243. data/app/views/passwords/edit.html.haml +0 -15
  244. data/app/views/passwords/new.html.haml +0 -10
  245. data/app/views/user_mailer/password_reset_instructions.html.haml +0 -6
  246. data/app/views/users/new.html.haml +0 -19
  247. data/spec/controllers/authentications_controller_spec.rb +0 -150
  248. data/spec/controllers/passwords_controller_spec.rb +0 -32
  249. data/spec/models/users/authentication_spec.rb +0 -19
  250. data/spec/support/auth_macros.rb +0 -49
  251. data/spec/views/authentications/new.haml_spec.rb +0 -31
data/Procfile CHANGED
@@ -1 +1 @@
1
- web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
1
+ web: bundle exec puma -C config/puma.rb
data/README.md CHANGED
@@ -84,7 +84,7 @@ This is the best way to deploy Fat Free CRM if you need to add plugins or make a
84
84
 
85
85
  ## Upgrading from previous versions of Fat Free CRM
86
86
 
87
- Please read the [Release Notes](https://github.com/fatfreecrm/fat_free_crm/blob/master/CHANGELOG.md) document for more detailed information on upgrading from previous versions.
87
+ Please read the [Changelog](https://github.com/fatfreecrm/fat_free_crm/blob/master/CHANGELOG.md) document for more detailed information on upgrading from previous versions.
88
88
 
89
89
 
90
90
  ## Resources
@@ -122,7 +122,7 @@ Tests can easily be run by typing 'rake' but please note that they do take a whi
122
122
  * steveyken
123
123
 
124
124
 
125
- See the [contributors graph](https://github.com/fatfreecrm/fat_free_crm/graphs/contributors) and the [contributors file](https://github.com/fatfreecrm/fat_free_crm/blob/master/CONTRIBUTORS) for further details.
125
+ See the [contributors graph](https://github.com/fatfreecrm/fat_free_crm/graphs/contributors) and the [contributors file](https://github.com/fatfreecrm/fat_free_crm/blob/master/CONTRIBUTORS.md) for further details.
126
126
 
127
127
  ## License
128
128
 
data/Rakefile CHANGED
@@ -4,7 +4,7 @@
4
4
  # Add your own tasks in files placed in lib/tasks ending in .rake,
5
5
  # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
6
6
 
7
- require File.expand_path('../config/application', __FILE__)
7
+ require File.expand_path('config/application', __dir__)
8
8
 
9
9
  FatFreeCRM::Application.load_tasks
10
10
 
@@ -89,7 +89,7 @@ $sidebar_width: 210px;
89
89
  -moz-box-shadow: 5px 5px 15px #bbbbbb, -5px 0px 15px #bbbbbb;
90
90
  -webkit-border-radius: 6px;
91
91
  -webkit-box-shadow: 5px 5px 15px #bbbbbb, -5px 0px 15px #bbbbbb;
92
- input[type="text"], input[type="password"] {
92
+ input[type="text"], input[type="email"], input[type="password"] {
93
93
  font-size: 16px;
94
94
  padding: 2px;
95
95
  width: 355px; }
@@ -23,7 +23,7 @@ class Admin::ApplicationController < ApplicationController
23
23
 
24
24
  #----------------------------------------------------------------------------
25
25
  def require_admin_user
26
- require_user
26
+ authenticate_user!
27
27
  unless current_user&.admin?
28
28
  flash[:notice] = t(:msg_require_admin)
29
29
  redirect_to root_path
@@ -22,9 +22,7 @@ class Admin::FieldGroupsController < Admin::ApplicationController
22
22
  def edit
23
23
  @field_group = FieldGroup.find(params[:id])
24
24
 
25
- if params[:previous].to_s =~ /(\d+)\z/
26
- @previous = FieldGroup.find_by_id(Regexp.last_match[1]) || Regexp.last_match[1].to_i
27
- end
25
+ @previous = FieldGroup.find_by_id(Regexp.last_match[1]) || Regexp.last_match[1].to_i if params[:previous].to_s =~ /(\d+)\z/
28
26
 
29
27
  respond_with(@field_group)
30
28
  end
@@ -28,9 +28,7 @@ class Admin::TagsController < Admin::ApplicationController
28
28
  # GET /admin/tags/1/edit AJAX
29
29
  #----------------------------------------------------------------------------
30
30
  def edit
31
- if params[:previous].to_s =~ /(\d+)\z/
32
- @previous = Tag.find_by_id(Regexp.last_match[1]) || Regexp.last_match[1].to_i
33
- end
31
+ @previous = Tag.find_by_id(Regexp.last_match[1]) || Regexp.last_match[1].to_i if params[:previous].to_s =~ /(\d+)\z/
34
32
  end
35
33
 
36
34
  # POST /admin/tags
@@ -35,9 +35,7 @@ class Admin::UsersController < Admin::ApplicationController
35
35
  # GET /admin/users/1/edit AJAX
36
36
  #----------------------------------------------------------------------------
37
37
  def edit
38
- if params[:previous].to_s =~ /(\d+)\z/
39
- @previous = User.find_by_id(Regexp.last_match[1]) || Regexp.last_match[1].to_i
40
- end
38
+ @previous = User.find_by_id(Regexp.last_match[1]) || Regexp.last_match[1].to_i if params[:previous].to_s =~ /(\d+)\z/
41
39
 
42
40
  respond_with(@user)
43
41
  end
@@ -48,7 +46,7 @@ class Admin::UsersController < Admin::ApplicationController
48
46
  def create
49
47
  @user = User.new(user_params)
50
48
  @user.suspend_if_needs_approval
51
- @user.save_without_session_maintenance
49
+ @user.save
52
50
 
53
51
  respond_with(@user)
54
52
  end
@@ -59,7 +57,7 @@ class Admin::UsersController < Admin::ApplicationController
59
57
  def update
60
58
  @user = User.find(params[:id])
61
59
  @user.attributes = user_params
62
- @user.save_without_session_maintenance
60
+ @user.save
63
61
 
64
62
  respond_with(@user)
65
63
  end
@@ -74,9 +72,7 @@ class Admin::UsersController < Admin::ApplicationController
74
72
  # DELETE /admin/users/1.xml AJAX
75
73
  #----------------------------------------------------------------------------
76
74
  def destroy
77
- unless @user.destroyable?(current_user) && @user.destroy
78
- flash[:warning] = t(:msg_cant_delete_user, @user.full_name)
79
- end
75
+ flash[:warning] = t(:msg_cant_delete_user, @user.full_name) unless @user.destroyable?(current_user) && @user.destroy
80
76
 
81
77
  respond_with(@user)
82
78
  end
@@ -107,6 +103,7 @@ class Admin::UsersController < Admin::ApplicationController
107
103
 
108
104
  def user_params
109
105
  return {} unless params[:user]
106
+
110
107
  params[:user][:email].try(:strip!)
111
108
  params[:user][:password_confirmation] = nil if params[:user][:password_confirmation].blank?
112
109
 
@@ -8,8 +8,9 @@
8
8
  class ApplicationController < ActionController::Base
9
9
  protect_from_forgery with: :exception
10
10
 
11
+ before_action :configure_devise_parameters, if: :devise_controller?
12
+ before_action :authenticate_user!
11
13
  before_action :set_paper_trail_whodunnit
12
-
13
14
  before_action :set_context
14
15
  before_action :clear_setting_cache
15
16
  before_action :cors_preflight_check
@@ -17,7 +18,6 @@ class ApplicationController < ActionController::Base
17
18
  after_action { hook(:app_after_filter, self) }
18
19
  after_action :cors_set_access_control_headers
19
20
 
20
- helper_method :current_user_session, :current_user, :can_signup?
21
21
  helper_method :called_from_index_page?, :called_from_landing_page?
22
22
  helper_method :klass
23
23
 
@@ -73,16 +73,17 @@ class ApplicationController < ActionController::Base
73
73
  end
74
74
 
75
75
  #
76
- # Takes { :related => 'campaigns/7' } or { :related => '5' }
76
+ # Takes { related: 'campaigns/7' } or { related: '5' }
77
77
  # and returns array of object ids that should be excluded from search
78
78
  # assumes controller_name is a method on 'related' class that returns a collection
79
79
  #----------------------------------------------------------------------------
80
80
  def auto_complete_ids_to_exclude(related)
81
81
  return [] if related.blank?
82
82
  return [related.to_i].compact unless related.index('/')
83
+
83
84
  related_class, id = related.split('/')
84
85
  obj = related_class.classify.constantize.find_by_id(id)
85
- if obj && obj.respond_to?(controller_name)
86
+ if obj&.respond_to?(controller_name)
86
87
  obj.send(controller_name).map(&:id)
87
88
  else
88
89
  []
@@ -114,47 +115,6 @@ class ApplicationController < ActionController::Base
114
115
  @current_tab = tab
115
116
  end
116
117
 
117
- #----------------------------------------------------------------------------
118
- def current_user_session
119
- @current_user_session ||= Authentication.find
120
- @current_user_session = nil if @current_user_session&.record&.suspended?
121
- @current_user_session
122
- end
123
-
124
- #----------------------------------------------------------------------------
125
- def current_user
126
- unless @current_user
127
- @current_user = (current_user_session&.record)
128
- if @current_user
129
- @current_user.set_individual_locale
130
- @current_user.set_single_access_token
131
- end
132
- User.current_user = @current_user
133
- end
134
- @current_user
135
- end
136
-
137
- #----------------------------------------------------------------------------
138
- def require_user
139
- unless current_user
140
- store_location
141
- flash[:notice] = t(:msg_login_needed) if request.fullpath != "/"
142
- respond_to do |format|
143
- format.html { redirect_to login_url }
144
- format.js { render plain: "window.location = '#{login_url}';" }
145
- end
146
- end
147
- end
148
-
149
- #----------------------------------------------------------------------------
150
- def require_no_user
151
- if current_user
152
- store_location
153
- flash[:notice] = t(:msg_logout_needed)
154
- redirect_to profile_url
155
- end
156
- end
157
-
158
118
  #----------------------------------------------------------------------------
159
119
  def store_location
160
120
  session[:return_to] = request.fullpath
@@ -282,6 +242,12 @@ class ApplicationController < ActionController::Base
282
242
  end
283
243
  end
284
244
 
245
+ def configure_devise_parameters
246
+ devise_parameter_sanitizer.permit(:sign_up) do |user_params|
247
+ user_params.permit(:username, :email, :password, :password_confirmation)
248
+ end
249
+ end
250
+
285
251
  def find_class(asset)
286
252
  Rails.application.eager_load! unless Rails.application.config.cache_classes
287
253
  classes = ActiveRecord::Base.descendants.map(&:name)
@@ -6,8 +6,6 @@
6
6
  # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
7
7
  #------------------------------------------------------------------------------
8
8
  class CommentsController < ApplicationController
9
- before_action :require_user
10
-
11
9
  # GET /comments
12
10
  # GET /comments.json
13
11
  # GET /comments.xml
@@ -37,9 +35,7 @@ class CommentsController < ApplicationController
37
35
 
38
36
  model = find_class(@comment.commentable_type)
39
37
  id = @comment.commentable_id
40
- unless model.my(current_user).find_by_id(id)
41
- respond_to_related_not_found(model.downcase)
42
- end
38
+ respond_to_related_not_found(model.downcase) unless model.my(current_user).find_by_id(id)
43
39
  end
44
40
 
45
41
  # POST /comments
@@ -85,6 +81,7 @@ class CommentsController < ApplicationController
85
81
 
86
82
  def comment_params
87
83
  return {} unless params[:comment]
84
+
88
85
  params.require(:comment).permit(
89
86
  :user_id,
90
87
  :commentable_type,
@@ -4,5 +4,7 @@
4
4
  #
5
5
  # Fat Free CRM is freely distributable under the terms of MIT license.
6
6
  # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
7
- #------------------------------------------------------------------------------
8
- require 'authlogic'
7
+ class ConfirmationsController < Devise::ConfirmationsController
8
+ respond_to :html
9
+ append_view_path 'app/views/devise'
10
+ end
@@ -6,8 +6,6 @@
6
6
  # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
7
7
  #------------------------------------------------------------------------------
8
8
  class EmailsController < ApplicationController
9
- before_action :require_user
10
-
11
9
  # DELETE /emails/1
12
10
  # DELETE /emails/1.json
13
11
  # DELETE /emails/1.xml AJAX
@@ -45,9 +45,7 @@ class AccountsController < EntitiesController
45
45
  # GET /accounts/1/edit AJAX
46
46
  #----------------------------------------------------------------------------
47
47
  def edit
48
- if params[:previous].to_s =~ /(\d+)\z/
49
- @previous = Account.my(current_user).find_by_id(Regexp.last_match[1]) || Regexp.last_match[1].to_i
50
- end
48
+ @previous = Account.my(current_user).find_by_id(Regexp.last_match[1]) || Regexp.last_match[1].to_i if params[:previous].to_s =~ /(\d+)\z/
51
49
 
52
50
  respond_with(@account)
53
51
  end
@@ -84,9 +84,7 @@ class CampaignsController < EntitiesController
84
84
  # GET /campaigns/1/edit AJAX
85
85
  #----------------------------------------------------------------------------
86
86
  def edit
87
- if params[:previous].to_s =~ /(\d+)\z/
88
- @previous = Campaign.my(current_user).find_by_id(Regexp.last_match[1]) || Regexp.last_match[1].to_i
89
- end
87
+ @previous = Campaign.my(current_user).find_by_id(Regexp.last_match[1]) || Regexp.last_match[1].to_i if params[:previous].to_s =~ /(\d+)\z/
90
88
 
91
89
  respond_with(@campaign)
92
90
  end
@@ -51,9 +51,7 @@ class ContactsController < EntitiesController
51
51
  #----------------------------------------------------------------------------
52
52
  def edit
53
53
  @account = @contact.account || Account.new(user: current_user)
54
- if params[:previous].to_s =~ /(\d+)\z/
55
- @previous = Contact.my(current_user).find_by_id(Regexp.last_match[1]) || Regexp.last_match[1].to_i
56
- end
54
+ @previous = Contact.my(current_user).find_by_id(Regexp.last_match[1]) || Regexp.last_match[1].to_i if params[:previous].to_s =~ /(\d+)\z/
57
55
 
58
56
  respond_with(@contact)
59
57
  end
@@ -67,17 +65,7 @@ class ContactsController < EntitiesController
67
65
  @contact.add_comment_by_user(@comment_body, current_user)
68
66
  @contacts = get_contacts if called_from_index_page?
69
67
  else
70
- if params[:account]
71
- @account = if params[:account][:id].blank?
72
- if request.referer =~ /\/accounts\/(\d+)\z/
73
- Account.find(Regexp.last_match[1]) # related account
74
- else
75
- Account.new(user: current_user)
76
- end
77
- else
78
- Account.find(params[:account][:id])
79
- end
80
- end
68
+ @account = guess_related_account(params[:account][:id], request.referer, current_user) if params[:account]
81
69
  @opportunity = Opportunity.my(current_user).find(params[:opportunity]) unless params[:opportunity].blank?
82
70
  end
83
71
  end
@@ -87,13 +75,7 @@ class ContactsController < EntitiesController
87
75
  #----------------------------------------------------------------------------
88
76
  def update
89
77
  respond_with(@contact) do |_format|
90
- unless @contact.update_with_account_and_permissions(params.permit!)
91
- @account = if @contact.account
92
- @contact.account
93
- else
94
- Account.new(user: current_user)
95
- end
96
- end
78
+ @account = @contact.account || Account.new(user: current_user) unless @contact.update_with_account_and_permissions(params.permit!)
97
79
  end
98
80
  end
99
81
 
@@ -128,9 +110,7 @@ class ContactsController < EntitiesController
128
110
  # Sorting and naming only: set the same option for Leads if the hasn't been set yet.
129
111
  if params[:sort_by]
130
112
  current_user.pref[:contacts_sort_by] = Contact.sort_by_map[params[:sort_by]]
131
- if Lead.sort_by_fields.include?(params[:sort_by])
132
- current_user.pref[:leads_sort_by] ||= Lead.sort_by_map[params[:sort_by]]
133
- end
113
+ current_user.pref[:leads_sort_by] ||= Lead.sort_by_map[params[:sort_by]] if Lead.sort_by_fields.include?(params[:sort_by])
134
114
  end
135
115
  if params[:naming]
136
116
  current_user.pref[:contacts_naming] = params[:naming]
@@ -52,9 +52,7 @@ class LeadsController < EntitiesController
52
52
  def edit
53
53
  get_campaigns
54
54
 
55
- if params[:previous].to_s =~ /(\d+)\z/
56
- @previous = Lead.my(current_user).find_by_id(Regexp.last_match[1]) || Regexp.last_match[1].to_i
57
- end
55
+ @previous = Lead.my(current_user).find_by_id(Regexp.last_match[1]) || Regexp.last_match[1].to_i if params[:previous].to_s =~ /(\d+)\z/
58
56
 
59
57
  respond_with(@lead)
60
58
  end
@@ -110,9 +108,7 @@ class LeadsController < EntitiesController
110
108
  @accounts = Account.my(current_user).order('name')
111
109
  @opportunity = Opportunity.new(user: current_user, access: "Lead", stage: "prospecting", campaign: @lead.campaign, source: @lead.source)
112
110
 
113
- if params[:previous].to_s =~ /(\d+)\z/
114
- @previous = Lead.my(current_user).find_by_id(Regexp.last_match[1]) || Regexp.last_match[1].to_i
115
- end
111
+ @previous = Lead.my(current_user).find_by_id(Regexp.last_match[1]) || Regexp.last_match[1].to_i if params[:previous].to_s =~ /(\d+)\z/
116
112
 
117
113
  respond_with(@lead)
118
114
  end
@@ -142,7 +138,10 @@ class LeadsController < EntitiesController
142
138
  update_sidebar
143
139
 
144
140
  respond_with(@lead) do |format|
145
- format.html { flash[:notice] = t(:msg_asset_rejected, @lead.full_name); redirect_to leads_path }
141
+ format.html do
142
+ flash[:notice] = t(:msg_asset_rejected, @lead.full_name)
143
+ redirect_to leads_path
144
+ end
146
145
  end
147
146
  end
148
147
 
@@ -166,9 +165,7 @@ class LeadsController < EntitiesController
166
165
  # Sorting and naming only: set the same option for Contacts if the hasn't been set yet.
167
166
  if params[:sort_by]
168
167
  current_user.pref[:leads_sort_by] = Lead.sort_by_map[params[:sort_by]]
169
- if Contact.sort_by_fields.include?(params[:sort_by])
170
- current_user.pref[:contacts_sort_by] ||= Contact.sort_by_map[params[:sort_by]]
171
- end
168
+ current_user.pref[:contacts_sort_by] ||= Contact.sort_by_map[params[:sort_by]] if Contact.sort_by_fields.include?(params[:sort_by])
172
169
  end
173
170
  if params[:naming]
174
171
  current_user.pref[:leads_naming] = params[:naming]
@@ -34,8 +34,8 @@ class OpportunitiesController < EntitiesController
34
34
  #----------------------------------------------------------------------------
35
35
  def new
36
36
  @opportunity.attributes = { user: current_user, stage: Opportunity.default_stage, access: Setting.default_access, assigned_to: nil }
37
- @account = Account.new(user: current_user, access: Setting.default_access)
38
- @accounts = Account.my(current_user).order('name')
37
+ @account = Account.new(user: current_user, access: Setting.default_access)
38
+ @accounts = Account.my(current_user).order('name')
39
39
 
40
40
  if params[:related]
41
41
  model, id = params[:related].split('_')
@@ -57,9 +57,7 @@ class OpportunitiesController < EntitiesController
57
57
  @account = @opportunity.account || Account.new(user: current_user)
58
58
  @accounts = Account.my(current_user).order('name')
59
59
 
60
- if params[:previous].to_s =~ /(\d+)\z/
61
- @previous = Opportunity.my(current_user).find_by_id(Regexp.last_match[1]) || Regexp.last_match[1].to_i
62
- end
60
+ @previous = Opportunity.my(current_user).find_by_id(Regexp.last_match[1]) || Regexp.last_match[1].to_i if params[:previous].to_s =~ /(\d+)\z/
63
61
 
64
62
  respond_with(@opportunity)
65
63
  end
@@ -81,15 +79,7 @@ class OpportunitiesController < EntitiesController
81
79
  end
82
80
  else
83
81
  @accounts = Account.my(current_user).order('name')
84
- @account = if params[:account][:id].blank?
85
- if request.referer =~ /\/accounts\/(\d+)\z/
86
- Account.find(Regexp.last_match[1]) # related account
87
- else
88
- Account.new(user: current_user)
89
- end
90
- else
91
- Account.find(params[:account][:id])
92
- end
82
+ @account = guess_related_account(params[:account][:id], request.referer, current_user)
93
83
  @contact = Contact.find(params[:contact]) unless params[:contact].blank?
94
84
  @campaign = Campaign.find(params[:campaign]) unless params[:campaign].blank?
95
85
  end
@@ -6,7 +6,6 @@
6
6
  # See MIT-LICENSE file or http://www.opensource.org/licenses/mit-license.php
7
7
  #------------------------------------------------------------------------------
8
8
  class EntitiesController < ApplicationController
9
- before_action :require_user
10
9
  before_action :set_current_tab, only: %i[index show]
11
10
  before_action :set_view, only: %i[index show redraw]
12
11
 
@@ -185,7 +184,7 @@ class EntitiesController < ApplicationController
185
184
 
186
185
  #----------------------------------------------------------------------------
187
186
  def update_recently_viewed
188
- entity.versions.create(event: :view, whodunnit: PaperTrail.whodunnit)
187
+ entity.versions.create(event: :view, whodunnit: PaperTrail.request.whodunnit)
189
188
  end
190
189
 
191
190
  # Somewhat simplistic parser that extracts query and hash-prefixed tags from
@@ -195,13 +194,18 @@ class EntitiesController < ApplicationController
195
194
  #----------------------------------------------------------------------------
196
195
  def parse_query_and_tags(search_string)
197
196
  return ['', ''] if search_string.blank?
197
+
198
198
  query = []
199
199
  tags = []
200
- search_string.strip.split(/\s+/).each do |token|
201
- if token.starts_with?("#")
202
- tags << token[1..-1]
203
- else
204
- query << token
200
+ if search_string.start_with?("#") && search_string.end_with?("#")
201
+ tags << search_string[1..-2]
202
+ else
203
+ search_string.strip.split(/\s+/).each do |token|
204
+ if token.starts_with?("#")
205
+ tags << token[1..-1]
206
+ else
207
+ query << token
208
+ end
205
209
  end
206
210
  end
207
211
  [query.join(" "), tags.join(", ")]
@@ -231,4 +235,14 @@ class EntitiesController < ApplicationController
231
235
  page = params[:page]&.to_i
232
236
  [0, page].max if page
233
237
  end
238
+
239
+ def guess_related_account(id, url, user)
240
+ return Account.find(id) unless id.blank?
241
+
242
+ if url =~ %r{/accounts/(\d+)\z}
243
+ Account.find(Regexp.last_match[1]) # related account
244
+ else
245
+ Account.new(user: user)
246
+ end
247
+ end
234
248
  end