symphonia 4.2.0 → 5.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 (57) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +27 -1
  3. data/app/assets/javascripts/symphonia/application.js +3 -3
  4. data/app/assets/stylesheets/symphonia/_font_awesome.scss +8 -6
  5. data/app/assets/stylesheets/symphonia/_layout.scss +33 -1
  6. data/app/assets/stylesheets/symphonia/basic.scss +3 -99
  7. data/app/assets/stylesheets/symphonia/filters.scss +3 -5
  8. data/app/assets/stylesheets/symphonia/symphonia_bootstrap.scss +1 -1
  9. data/app/controllers/symphonia/accounts_controller.rb +7 -3
  10. data/app/controllers/symphonia/application_controller.rb +2 -1
  11. data/app/controllers/symphonia/users_controller.rb +17 -29
  12. data/app/helpers/symphonia/application_helper.rb +48 -26
  13. data/app/models/symphonia/preference.rb +5 -5
  14. data/app/models/symphonia/user.rb +3 -35
  15. data/app/models/symphonia/user_ability.rb +46 -0
  16. data/app/views/common/403.html.erb +4 -3
  17. data/app/views/layouts/symphonia/application.html.erb +4 -4
  18. data/app/views/symphonia/accounts/_detail.html.erb +21 -18
  19. data/app/views/symphonia/common/_filters.html.erb +15 -15
  20. data/app/views/symphonia/common/_share_links.html.erb +2 -3
  21. data/app/views/symphonia/users/_form.html.erb +1 -6
  22. data/app/views/symphonia/users/show.html.erb +15 -20
  23. data/config/locales/cs.yml +3 -2
  24. data/db/migrate/20130714140500_create_users.rb +0 -2
  25. data/db/seeds.rb +3 -3
  26. data/lib/generators/symphonia/entity_controller/entity_controller_generator.rb +2 -2
  27. data/lib/generators/symphonia/entity_controller/templates/{controller.rb → controller.rb.tt} +0 -0
  28. data/lib/symphonia/admin_constraint.rb +1 -1
  29. data/lib/symphonia/base_controller.rb +9 -17
  30. data/lib/symphonia/controller_extensions.rb +5 -15
  31. data/lib/symphonia/engine.rb +12 -40
  32. data/lib/symphonia/form_builder.rb +17 -16
  33. data/lib/symphonia/menu_manager.rb +15 -11
  34. data/lib/symphonia/object.rb +9 -9
  35. data/lib/symphonia/spec_helper.rb +8 -4
  36. data/lib/symphonia/user_management.rb +1 -1
  37. data/lib/symphonia/version.rb +1 -1
  38. data/lib/symphonia.rb +12 -9
  39. data/spec/factories/factories.rb +0 -4
  40. data/spec/models/user_spec.rb +39 -2
  41. data/spec/spec_helper.rb +0 -1
  42. data/spec/support/stub_users.rb +7 -7
  43. metadata +39 -124
  44. data/app/controllers/symphonia/roles_controller.rb +0 -39
  45. data/app/models/symphonia/role.rb +0 -55
  46. data/app/views/symphonia/roles/_form.html.erb +0 -26
  47. data/app/views/symphonia/roles/edit.html.erb +0 -5
  48. data/app/views/symphonia/roles/index.html.erb +0 -6
  49. data/app/views/symphonia/roles/new.html.erb +0 -4
  50. data/app/views/symphonia/roles/show.html.erb +0 -11
  51. data/db/migrate/20130714140501_create_roles.rb +0 -18
  52. data/db/migrate/20210509141420_roles_change_permissions_to_json.rb +0 -18
  53. data/db/migrate/20210509180525_roles_change_permissions_to_native_json.rb +0 -7
  54. data/lib/symphonia/permissions.rb +0 -93
  55. data/spec/controllers/roles_controller_spec.rb +0 -12
  56. data/spec/models/role_spec.rb +0 -13
  57. data/spec/requests/roles_spec.rb +0 -10
@@ -11,7 +11,6 @@ module Symphonia
11
11
  add_attribute :last_name
12
12
  add_attribute :email, :mail, default: true
13
13
  add_attribute :status, :enum, filter: "select"
14
- add_attribute :role, :reference
15
14
  add_attribute :admin, :boolean
16
15
  add_attribute :login_count
17
16
  add_attribute :last_login_ip
@@ -34,8 +33,7 @@ module Symphonia
34
33
 
35
34
  has_and_belongs_to_many :preferences, foreign_key: 'user_id'
36
35
 
37
- belongs_to :edited_by, class_name: 'Symphonia::User', required: false
38
- belongs_to :role, required: false
36
+ belongs_to :edited_by, class_name: 'Symphonia::User', optional: true
39
37
 
40
38
  accepts_nested_attributes_for :preferences
41
39
 
@@ -46,29 +44,6 @@ module Symphonia
46
44
 
47
45
  alias_attribute :mail, :email
48
46
 
49
-
50
- before_save do |model|
51
- Rails.cache.delete_matched('user_allowed_to*') if model.role_id_changed?
52
- end
53
-
54
- def allowed_to?(action)
55
- return true if admin?
56
-
57
- Rails.cache.fetch([:user_allowed_to, self, action]) do
58
- role_id && role.allowed_to?(action)
59
- end
60
- end
61
-
62
- def authorize?(controller, action)
63
- return true if admin?
64
-
65
- if role_id
66
- role.authorize?(controller, action)
67
- else
68
- false
69
- end
70
- end
71
-
72
47
  # def form_path
73
48
  # 'symphonia/users/form'
74
49
  # end
@@ -97,14 +72,6 @@ module Symphonia
97
72
  'anonym@nothing'
98
73
  end
99
74
 
100
- def allowed_to?(_action)
101
- false
102
- end
103
-
104
- def authorize?(_controller, _action)
105
- false
106
- end
107
-
108
75
  def save
109
76
  false
110
77
  end
@@ -117,7 +84,7 @@ module Symphonia
117
84
  false
118
85
  end
119
86
 
120
- alias_method :admin?, :admin
87
+ alias admin? admin
121
88
 
122
89
  def logged_in?
123
90
  false
@@ -130,6 +97,7 @@ module Symphonia
130
97
  def language
131
98
  nil
132
99
  end
100
+
133
101
  end
134
102
 
135
103
  end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Symphonia
4
+ class UserAbility
5
+ include CanCan::Ability
6
+
7
+ def initialize(user)
8
+ return unless user.logged_in?
9
+
10
+ can :update, User, id: user.id
11
+ can :read, User, id: user.id
12
+ return unless user.admin?
13
+
14
+ can :archive, User, status: :active
15
+ can :activate, User, status: :pending
16
+ can :unarchive, User, status: :archived
17
+
18
+ can %i[read create update destroy], :all
19
+ # Define abilities for the user here. For example:
20
+ #
21
+ # return unless user.present?
22
+ # can :read, :all
23
+ # return unless user.admin?
24
+ # can :manage, :all
25
+ #
26
+ # The first argument to `can` is the action you are giving the user
27
+ # permission to do.
28
+ # If you pass :manage it will apply to every action. Other common actions
29
+ # here are :read, :create, :update and :destroy.
30
+ #
31
+ # The second argument is the resource the user can perform the action on.
32
+ # If you pass :all it will apply to every resource. Otherwise pass a Ruby
33
+ # class of the resource.
34
+ #
35
+ # The third argument is an optional hash of conditions to further filter the
36
+ # objects.
37
+ # For example, here the user can only update published articles.
38
+ #
39
+ # can :update, Article, published: true
40
+ #
41
+ # See the wiki for details:
42
+ # https://github.com/CanCanCommunity/cancancan/blob/develop/docs/define_check_abilities.md
43
+ end
44
+
45
+ end
46
+ end
@@ -1,5 +1,6 @@
1
- <i class="fa fa-hand-stop-o fa-5x pull-left"></i> <%= page_header 403 %>
2
- <p class="clearfix">
1
+ <%= page_header 403 %>
2
+ <p class="alert alert-danger">
3
+ <i class="fa fa-hand-stop-o fa-5x"></i>
3
4
  <%= t :text_access_deny %>
4
5
  </p>
5
- <%= link_to icon('back', t(:button_back)), :back, class: 'btn btn-link' %>
6
+ <%= link_to icon('back', t(:button_back)), :back, class: 'btn btn-link' %>
@@ -8,9 +8,9 @@
8
8
  <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': true %>
9
9
  <%= yield :stylesheet_tags %>
10
10
  <%= javascript_include_tag 'application', 'data-turbolinks-track': true %>
11
- <script type="text/javascript">
12
- Symphonia.routes.reorderImagesPath = '<%= symphonia.reorder_attachment_path %>';
13
- </script>
11
+ <!-- <script type="text/javascript">-->
12
+ <!-- Symphonia.routes.reorderImagesPath = '<%#= symphonia.reorder_attachment_path %>';-->
13
+ <!-- </script>-->
14
14
  <%= yield :javascript_tags %>
15
15
  <%= csrf_meta_tags %>
16
16
  </head>
@@ -19,7 +19,7 @@
19
19
  <nav class="navbar navbar-expand-lg navbar-light bg-light fixed-top">
20
20
  <!--<a class="navbar-brand" href="#">Navbar</a>-->
21
21
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
22
- <%= fa_icon('bars') %>
22
+ <%= icon('bars') %>
23
23
  </button>
24
24
 
25
25
  <div class="collapse navbar-collapse" id="navbarSupportedContent">
@@ -1,16 +1,17 @@
1
+ <%= ActiveSupport::Deprecation.warn "View 'accounts/_detail' partial should not use anymore" %>
1
2
  <div class="buttons contextual">
2
3
  <% if Symphonia::User.current.admin? %>
3
4
  <% controller = account.class.name.underscore.pluralize %>
4
5
  <%= link_to(icon('edit', t(:button_edit)), edit_polymorphic_path(account), class: 'btn btn-primary') %>
5
6
  <% if use_service_buttons %>
6
7
  <% if account.active? %>
7
- <%= link_to(fa_icon('lock', text: t(:button_archive)), {:controller => controller, :action => 'archive', :id => account, :back_url => polymorphic_path(account)}, :class => 'btn btn-secondary', :data => {:method => 'post', :confirm => t(:text_are_you_sure)}) %>
8
+ <%#= link_to(icon('lock', text: t(:button_archive)), polymorphic_path([controller_name, 'archive', account], back_url: polymorphic_path(account)), class: 'btn btn-secondary', data: { method: 'post', confirm: t(:text_are_you_sure) }) %>
8
9
  <% elsif account.status_new? %>
9
- <%= link_to(fa_icon('bolt', text: t(:button_active)), {:controller => controller, :action => 'unarchive', :id => account, :back_url => polymorphic_path(account)}, :class => 'btn btn-secondary', :data => {:method => 'post', :confirm => t(:text_are_you_sure) + "\n #{t(:text_confirm_send_unlock_mail)}"}) %>
10
+ <%= link_to(icon('bolt', text: t(:button_active)), { controller: controller, action: 'unarchive', id: account, back_url: polymorphic_path(account) }, class: 'btn btn-secondary', data: { method: 'post', confirm: t(:text_are_you_sure) + "\n #{t(:text_confirm_send_unlock_mail)}" }) %>
10
11
  <% else %>
11
- <%= link_to(fa_icon('unlock', text: t(:button_unarchive)), {:controller => controller, :action => 'unarchive', :id => account, :back_url => polymorphic_path(account)}, :class => 'btn btn-secondary', :data => {:method => 'post', :confirm => t(:text_are_you_sure) + "\n #{t(:text_confirm_send_unlock_mail)}"}) %>
12
+ <%= link_to(icon('unlock', text: t(:button_unarchive)), { controller: controller, action: 'unarchive', id: account, back_url: polymorphic_path(account) }, class: 'btn btn-secondary', data: { method: 'post', confirm: t(:text_are_you_sure) + "\n #{t(:text_confirm_send_unlock_mail)}" }) %>
12
13
  <% end %>
13
- <%= link_to(fa_icon('delete', text: t(:button_delete)), account, :class => 'btn btn-danger', :method => 'delete', :data => {:confirm => t(:text_are_you_sure)}) %>
14
+ <%= link_to(icon('delete', text: t(:button_delete)), account, class: 'btn btn-danger', method: 'delete', data: { :confirm => t(:text_are_you_sure) }) %>
14
15
  <% end -%>
15
16
  <% else %>
16
17
  <%= link_to(icon('edit', t(:button_edit)), edit_polymorphic_path(controller_name.singularize, id: account.id), :class => 'btn btn-primary', :remote => true) %>
@@ -24,29 +25,31 @@
24
25
  <div class="col-md-4">
25
26
  <div class="row">
26
27
  <div class="col-md-6"><b><%= account.class.human_attribute_name(:login) %></b></div>
27
- <div class="col-md-6"><span ><%= account.login %></span></div>
28
+ <div class="col-md-6"><span><%= account.login %></span></div>
28
29
  </div>
29
30
  </div>
30
31
  <div class="col-md-4">
31
32
  <div class="row">
32
33
  <div class="col-md-6"><b><%= account.class.human_attribute_name(:email) %></b></div>
33
- <div class="col-md-6"><span ><%= account.format_value(:email, self) %></span></div>
34
+ <div class="col-md-6"><span><%= account.format_value(:email, self) %></span></div>
34
35
  </div>
35
36
  </div>
36
37
  </div>
37
38
 
38
39
  <div id="customer_detail" style="display: none">
39
40
  <div class="clearfix">
40
- <%= content_tag(:strong, account.class.human_attribute_name(:current_login_at), :class => 'col-xs-6') %>
41
- <%= content_tag(:div, account.current_login_at ? time_tag(account.current_login_at) : '-', :class => 'col-xs-6') %>
42
- <%= content_tag(:strong, account.class.human_attribute_name(:current_login_ip), :class => 'col-xs-6') %>
43
- <%= content_tag(:div, account.current_login_ip || '-', :class => 'col-xs-6') %>
44
- <%= content_tag(:strong, account.class.human_attribute_name(:last_login_at), :class => 'col-xs-6') %>
45
- <%= content_tag(:div, account.last_login_at ? time_tag(account.last_login_at.localtime) : '-', :class => 'col-xs-6') %>
46
- <%= content_tag(:strong, account.class.human_attribute_name(:last_login_ip), :class => 'col-xs-6') %>
47
- <%= content_tag(:div, account.last_login_ip || '-', :class => 'col-xs-6') %>
48
- <%= content_tag(:strong, account.class.human_attribute_name(:single_access_token), :class => 'col-xs-6') %>
49
- <%= content_tag(:div, text_field_tag(:token, account.single_access_token, :style => 'border:none'), :class => 'col-xs-6') %>
41
+ <b class="col-xs-6"><%= account.class.human_attribute_name(:current_login_at) %></b>
42
+ <div class="col-xs-6"><%= account.current_login_at ? time_tag(account.current_login_at) : '-' %></div>
43
+ <b class="col-xs-6"><%= account.class.human_attribute_name(:current_login_ip) %></b>
44
+ <div class="col-xs-6"><%= account.current_login_ip || '-' %></div>
45
+ <b class="col-xs-6"><%= account.class.human_attribute_name(:last_login_at) %></b>
46
+ <div class="col-xs-6"><%= account.last_login_at ? time_tag(account.last_login_at.localtime) : '-' %></div>
47
+ <b class="col-xs-6"><%= account.class.human_attribute_name(:last_login_ip) %></b>
48
+ <div class="col-xs-6"><%= account.last_login_ip || '-' %></div>
49
+ <b class="col-xs-6"><%= account.class.human_attribute_name(:single_access_token) %></b>
50
+ <div class="col-xs-6">
51
+ <%= text_field_tag(:token, account.single_access_token, style: 'border:none') %>
52
+ </div>
50
53
  </div>
51
54
  </div>
52
55
 
@@ -54,7 +57,7 @@
54
57
  SymphoniaUserDetail = {
55
58
  popup: {
56
59
  dialog: null,
57
- show: function() {
60
+ show: function () {
58
61
  if (!this.dialog) {
59
62
  this.dialog = new SymphoniaDialog("customer_detail");
60
63
  }
@@ -62,4 +65,4 @@
62
65
  }
63
66
  }
64
67
  };
65
- </script>
68
+ </script>
@@ -1,23 +1,23 @@
1
1
  <% if @query %>
2
2
  <%#= bootstrap_form_tag(url: {set_filter: 1}, method: :get, class: 'form-horizontal', id: 'symphonia_filters_form') do |f| %>
3
- <div class="row hidden-print">
4
- <% if @query.search? %>
5
- <div class="col-sm-12">
6
- <div class="input-group input-group-sm">
7
- <%= search_field_tag(:q, params[:q], class: 'form-control input-sm', id: 'symphonia_query_q', placeholder: t(:label_search), autofocus: params[:q].present? || nil, data: {remote: local_assigns[:remote]}, onchange: 'submitSymphoniaQueryQ(this)') %>
8
- <div class="input-group-append">
9
- <div class="input-group-text">
10
- <%= link_to(fa_icon('search'), 'javascript:void(0)', {onclick: 'Symphonia.filters.search(document.getElementById("symphonia_query_q"))', title: t(:button_search)}) %>
11
- <%= link_to(fa_icon('filter'), symphonia.filters_options_path(@query.model.name, @query.to_params.merge(path: j(request.url))), remote: true, title: t(:title_advanced_filters)) unless local_assigns.key?(:hide_advanced_filter) %>
12
- <%= link_to(fa_icon('false'), 'javascript:void(0)', onclick: 'Symphonia.filters.resetSearch(document.getElementById("symphonia_query_q"))') if params[:q] %>
13
- </div>
14
-
3
+ <div class="row hidden-print">
4
+ <% if @query.search? %>
5
+ <div class="col-sm-12">
6
+ <div class="input-group input-group-sm">
7
+ <%= search_field_tag(:q, params[:q], class: 'form-control input-sm', id: 'symphonia_query_q', placeholder: t(:label_search), autofocus: params[:q].present? || nil, data: { remote: local_assigns[:remote] }, onchange: 'submitSymphoniaQueryQ(this)') %>
8
+ <div class="input-group-append">
9
+ <div class="input-group-text">
10
+ <%= link_to(icon('search'), 'javascript:void(0)', { onclick: 'Symphonia.filters.search(document.getElementById("symphonia_query_q"))', title: t(:button_search) }) %>
11
+ <%= link_to(icon('filter'), symphonia.filters_options_path(@query.model.name, @query.to_params.merge(path: j(request.url))), remote: true, title: t(:title_advanced_filters)) unless local_assigns.key?(:hide_advanced_filter) %>
12
+ <%= link_to(icon('false'), 'javascript:void(0)', onclick: 'Symphonia.filters.resetSearch(document.getElementById("symphonia_query_q"))') if params[:q] %>
15
13
  </div>
14
+
16
15
  </div>
17
16
  </div>
18
- <% end %>
19
- </div>
17
+ </div>
18
+ <% end %>
19
+ </div>
20
20
  <%# end %>
21
21
  <% else %>
22
- <%= content_tag(:p, t(:text_error_query_not_init), class: 'no-data') %>
22
+ <%= render_no_data t(:text_error_query_not_init) %>
23
23
  <% end -%>
@@ -1,5 +1,4 @@
1
1
  <span class="share-buttons">
2
- <%= link_to(fa_icon("facebook-square #{icon_css}"), "http://www.facebook.com/share.php?u=#{url}&title=#{name}", :title => t(:facebook, :scope => [:share_on, :title]), :target => '_blank') %>
3
- <%= link_to(fa_icon("twitter-square #{icon_css}"), "http://twitter.com/home?status=#{name}+#{url}", :title => t(:twitter, :scope => [:share_on, :title]), :target => '_blank') %>
4
- <%= link_to(fa_icon("google-plus-square #{icon_css}"), "https://plus.google.com/share?url=#{url}", :title => t(:google_plus, :scope => [:share_on, :title]), :target => '_blank') %>
2
+ <%= link_to(icon("facebook-square #{icon_css}"), "http://www.facebook.com/share.php?u=#{url}&title=#{name}", title: t("share_on.title.facebook"), target: '_blank') %>
3
+ <%= link_to(icon("twitter-square #{icon_css}"), "http://twitter.com/home?status=#{name}+#{url}", title: t("share_on.title.twitter"), target: '_blank') %>
5
4
  </span>
@@ -2,12 +2,7 @@
2
2
  <% if Symphonia::User.current.admin? %>
3
3
  <div class="row justify-content-center">
4
4
  <div class="col-8">
5
- <%= f.check_box :admin, id: 'user_admin', layout: :inline %>
5
+ <%= f.check_box :admin, id: 'user_admin' %>
6
6
  </div>
7
- <% if @roles.any? %>
8
- <div class="col-9">
9
- <%= f.select(:role_id, options_from_collection_for_select(@roles, :id, :name, selected: @user.role_id), include_blank: true, layout: :horizontal) %>
10
- </div>
11
- <% end -%>
12
7
  </div>
13
8
  <% end %>
@@ -5,17 +5,12 @@
5
5
  <h4 class="card-title"><%= html_title(@user.name).join %></h4>
6
6
  <div class="card-text row">
7
7
  <div class="col-sm-8">
8
- <% %i(login email admin).each do |attribute| %>
8
+ <% %i[login email admin].each do |attribute| %>
9
9
  <% next if @user.send(attribute).to_s.blank? %>
10
10
  <dt><%= @user.class.human_attribute_name attribute %></dt>
11
11
  <dd><%= @user.format_value(attribute, self) %></dd>
12
12
  <% end %>
13
13
 
14
- <% if @user.role %>
15
- <dt><%= @user.class.human_attribute_name :role %></dt>
16
- <dd><%= @user.format_value(:role, Symphonia::User.current.admin? && self || nil) %></dd>
17
- <% end %>
18
-
19
14
  <% if @user.preferences.any? %>
20
15
  <dt><%= t(:label_user_notifications) %></dt>
21
16
  <% @user.preferences.each do |p| %>
@@ -25,20 +20,20 @@
25
20
  </div>
26
21
  <div class="col-sm-4">
27
22
 
28
- <% if Symphonia::User.current.admin? %>
23
+ <% if can? :edit, @user %>
29
24
  <%= link_to(icon('edit', t(:button_edit)), edit_user_path(@user), class: 'btn btn-primary btn-block') %>
30
- <% if true %>
31
- <% if @user.active? %>
32
- <%= link_to(icon('lock', t(:button_archive)), archive_user_path(@user, back_url: polymorphic_path(@user)), data: { method: 'post', confirm: t(:text_are_you_sure) }, class: 'btn btn-secondary btn-block') %>
33
- <% elsif @user.status_new? %>
34
- <%= link_to(icon('bolt', t(:button_active)), unarchive_user_path(@user, back_url: polymorphic_path(@user)), class: 'btn btn-secondary', data: { method: 'post', confirm: t(:text_are_you_sure) + "\n #{t(:text_confirm_send_unlock_mail)}" }) %>
35
- <% else %>
36
- <%= link_to(icon('unlock', t(:button_unarchive)), unarchive_user_path(@user, back_url: polymorphic_path(@user)), class: 'btn btn-secondary btn-block', data: { method: 'post', confirm: t(:text_are_you_sure) + "\n #{t(:text_confirm_send_unlock_mail)}" }) %>
37
- <% end %>
38
- <%= link_to(icon('delete', t(:button_delete)), @user, class: 'btn btn-danger btn-block', method: 'delete', data: { confirm: t(:text_are_you_sure) }) %>
39
- <% end -%>
40
- <% else %>
41
- <%= link_to(icon('edit', t(:button_edit)), edit_user_path(@user), class: 'btn btn-primary btn-block', remote: true) %>
25
+ <% end %>
26
+ <% if can? :archive, @user %>
27
+ <%= link_to(icon('lock', t(:button_archive)), archive_user_path(@user, back_url: polymorphic_path(@user)), data: { method: 'post', confirm: t(:text_are_you_sure) }, class: 'btn btn-secondary btn-block') %>
28
+ <% end %>
29
+ <% if can? :activate, @user %>
30
+ <%= link_to(icon('bolt', t(:button_active)), unarchive_user_path(@user, back_url: polymorphic_path(@user)), class: 'btn btn-secondary btn-block', data: { method: 'post', confirm: t(:text_are_you_sure) + "\n #{t(:text_confirm_send_unlock_mail)}" }) %>
31
+ <% end %>
32
+ <% if can? :unarchive, @user %>
33
+ <%= link_to(icon('unlock', t(:button_unarchive)), unarchive_user_path(@user, back_url: polymorphic_path(@user)), class: 'btn btn-secondary btn-block', data: { method: 'post', confirm: t(:text_are_you_sure) + "\n #{t(:text_confirm_send_unlock_mail)}" }) %>
34
+ <% end %>
35
+ <% if can? :destroy, @user %>
36
+ <%= link_to(icon('delete', t(:button_delete)), @user, class: 'btn btn-danger btn-block', method: 'delete', data: { confirm: t(:text_are_you_sure) }) %>
42
37
  <% end %>
43
38
  <%= link_to(icon('key', t(:detail)), 'javascript:void(0)', onclick: %q{Symphonia.dialog.show('customer_detail')}, class: 'btn btn-info btn-block') %>
44
39
  </div>
@@ -60,4 +55,4 @@
60
55
  <%= content_tag(:strong, @user.class.human_attribute_name(:single_access_token), :class => 'col-xs-6') %>
61
56
  <%= content_tag(:div, text_field_tag(:token, @user.single_access_token, :style => 'border:none'), :class => 'col-xs-6') %>
62
57
  </div>
63
- </div>
58
+ </div>
@@ -25,8 +25,9 @@ cs:
25
25
  present: Současnot
26
26
  future: Budoucnost
27
27
  formats:
28
- default: "%d. %B %Y %H:%M"
28
+ # default: "%d. %B %Y %H:%M"
29
29
  short: "%-d. %-m. %Y %H:%M"
30
+ long: "%-d. %-m. %Y %H:%M"
30
31
  attributes:
31
32
  updated_at: Aktualizováno
32
33
  created_at: Vytvořeno
@@ -50,7 +51,7 @@ cs:
50
51
  attachment: Příloha
51
52
  errors:
52
53
  template:
53
- body: "Formulář obsahuje chybně vyplněná pole:"
54
+ body: "Formulář obsahuje chyby:"
54
55
  attributes:
55
56
  attachment:
56
57
  attachment_file_name: Název souboru
@@ -37,8 +37,6 @@ class CreateUsers < ActiveRecord::Migration[5.1]
37
37
  t.references :edited_by
38
38
  t.datetime :edited_at
39
39
 
40
- t.references :role
41
-
42
40
  t.timestamps
43
41
  end
44
42
  end
data/db/seeds.rb CHANGED
@@ -3,11 +3,11 @@ u.attributes = {
3
3
  login: 'admin',
4
4
  first_name: 'Lukáš',
5
5
  last_name: 'Pokorný',
6
- email: 'luk4s.pokorny@gmail.com',
6
+ email: 'admin@luk4s.cz',
7
7
  password: 'admin',
8
8
  # password_confirmation: 'admin',
9
9
  admin: true,
10
- avatar_url: "https://secure.gravatar.com/avatar/3657d5f0e9747c1c21eb2b689a8dba0b?s=64"
10
+ avatar_url: "https://secure.gravatar.com/avatar/3657d5f0e9747c1c21eb2b689a8dba0b?s=64",
11
11
  }
12
12
  u.single_access_token = SecureRandom.hex(20)
13
- u.save!(validate: false)
13
+ u.save!(validate: false) if Symphonia::User.where(login: "admin").none?
@@ -19,7 +19,7 @@ module Generators
19
19
  argument :attributes, type: :array, default: [], banner: "field:type field:type"
20
20
 
21
21
  def create_controller_files
22
- template_file = options.api? ? "api_controller.rb" : "controller.rb"
22
+ template_file = options.api? ? "api_controller.rb.tt" : "controller.rb.tt"
23
23
  template template_file, File.join("app/controllers", controller_class_path, "#{controller_file_name}_controller.rb")
24
24
  end
25
25
 
@@ -45,4 +45,4 @@ module Generators
45
45
 
46
46
  end
47
47
  end
48
- end
48
+ end
@@ -4,7 +4,7 @@ module Symphonia
4
4
  def matches?(request)
5
5
  return false if (credentials = request.session["symphonia/user_credentials"]).blank?
6
6
 
7
- user = User.find_by_persistence_token(credentials.split(':')[0])
7
+ user = User.find_by(persistence_token: credentials.split(':')[0])
8
8
  user&.admin?
9
9
  end
10
10
 
@@ -13,16 +13,14 @@ module Symphonia
13
13
  # %i[]
14
14
  # end
15
15
  #
16
- # def swagger_path
17
- # false # => for disable swagger
18
- # "/my-custom-path" # => for custom route
19
- # end
16
+
20
17
  module BaseController
18
+
21
19
  extend ActiveSupport::Concern
22
20
 
23
21
  included do
24
22
  # before_action :authorize
25
- before_action :find_entity, only: [:show, :edit, :update, :destroy]
23
+ before_action :find_entity, only: %i[show edit update destroy]
26
24
 
27
25
  include Rails::Pagination
28
26
  helper Symphonia::BootstrapModalHelper
@@ -30,11 +28,9 @@ module Symphonia
30
28
 
31
29
  # @param [Class] model
32
30
  class_attribute :model
33
-
34
31
  end
35
32
 
36
33
  class_methods do
37
-
38
34
  # def model=(klass)
39
35
  # @model = klass
40
36
  # end
@@ -76,11 +72,11 @@ module Symphonia
76
72
  end
77
73
 
78
74
  def new
79
- @entity ||= instance_variable_set(:"@#{model_name}", model.new(params.fetch(model_name, {}).permit(safe_attributes)))
75
+ @entity ||= instance_variable_set(:"@#{model_name}",
76
+ model.new(params.fetch(model_name, {}).permit(safe_attributes)))
80
77
  end
81
78
 
82
- def edit
83
- end
79
+ def edit; end
84
80
 
85
81
  def create
86
82
  @entity ||= instance_variable_set(:"@#{model_name}", model.new(entity_params))
@@ -119,7 +115,7 @@ module Symphonia
119
115
  end
120
116
 
121
117
  def model_name
122
- model.name.demodulize.underscore.to_sym
118
+ model.name.demodulize.underscore
123
119
  end
124
120
 
125
121
  private
@@ -138,13 +134,9 @@ module Symphonia
138
134
  params.require(model_name).permit(safe_attributes)
139
135
  end
140
136
 
141
- def after_create
142
-
143
- end
137
+ def after_create; end
144
138
 
145
- def after_update
146
-
147
- end
139
+ def after_update; end
148
140
 
149
141
  end
150
142
  end
@@ -17,7 +17,7 @@ module Symphonia
17
17
  add_flash_types :error
18
18
 
19
19
  rescue_from ::ActiveRecord::RecordNotFound, with: :render_404
20
- rescue_from Unauthorized, with: :render_403
20
+ rescue_from Unauthorized, CanCan::AccessDenied, with: :render_403
21
21
 
22
22
  helper_method :current_user, :back_url
23
23
  end
@@ -117,7 +117,7 @@ module Symphonia
117
117
 
118
118
  # Renders a 200 response for successful updates or deletions via the API
119
119
  def render_api_ok
120
- head :ok
120
+ render_api_head :ok
121
121
  end
122
122
 
123
123
  # Renders a head API response
@@ -143,20 +143,10 @@ module Symphonia
143
143
  end
144
144
 
145
145
  def authorize
146
- if Symphonia::User.current.authorize?(controller_name, action_name)
147
- return true
148
- elsif Symphonia::User.current.logged_in?
149
- raise Unauthorized
150
- else
151
- respond_to do |format|
152
- format.html do
153
- return redirect_to(symphonia.login_path(back_url: request.path), error: t(:text_error_login_required))
154
- end
155
- format.any { return head 401 }
156
- end
157
- end
146
+ return true if Symphonia::User.current.admin?
147
+ raise Unauthorized if Symphonia::User.current.logged_in?
158
148
 
159
- raise Unauthorized
149
+ login_require
160
150
  end
161
151
 
162
152
  def handle_unverified_request
@@ -1,51 +1,37 @@
1
1
  require 'symphonia/object'
2
- require 'symphonia/menu_manager'
3
- require 'symphonia/permissions'
4
- require 'symphonia/user_management'
5
2
 
6
- require 'rails-i18n'
7
- require 'turbolinks'
8
3
  require 'authlogic'
4
+ require 'cancancan'
9
5
  require 'scrypt'
10
- require 'bootstrap'
11
6
 
12
7
  require 'will_paginate'
13
8
  require 'api-pagination'
14
- require 'font-awesome-rails'
15
- require 'jquery-rails'
16
- require 'jquery-ui-rails'
9
+
10
+ require 'rails_i18n'
17
11
  require 'rdiscount'
18
12
  require 'sortable-table'
19
13
  require 'bootstrap_form'
20
- require 'bootstrap-datepicker-rails'
21
- # require 'wicked_pdf'
22
- # require 'swagger/blocks'
23
14
 
24
15
  module Symphonia
25
16
 
26
17
  class Engine < ::Rails::Engine
27
18
  isolate_namespace Symphonia
28
19
 
20
+ config.autoload_paths << File.expand_path("..", __dir__)
21
+
29
22
  config.generators do |g|
30
23
  g.test_framework :rspec, fixture: false
31
24
  g.fixture_replacement :factory_bot, dir: 'spec/factories'
32
25
  end
33
26
 
34
- # Rails 5
35
- # ActionController::Base.class_eval do
36
- # include Symphonia::ApplicationController
37
- # end
38
-
39
-
40
27
  initializer :symphonia_extensions do
28
+ ActiveSupport.on_load(:action_controller_base) do
29
+ # prepend Symphonia::ApplicationController
30
+ helper Symphonia::ApplicationHelper
31
+ helper Symphonia::BootstrapModalHelper
32
+ end
41
33
  end
42
34
 
43
- # ActiveSupport::Reloader.to_prepare do
44
- # ::ApplicationController.send :helper, Symphonia::ApplicationHelper
45
- # ::ApplicationMailer.send :helper, Symphonia::ApplicationHelper
46
- # BootstrapForm::FormBuilder.prepend(Symphonia::FormBuilder)
47
- # end
48
-
49
35
  initializer :symphonia_setup do |_app|
50
36
  Mime::Type.register 'application/pdf', :pdf
51
37
  config.i18n.available_locales ||= %i[cs en]
@@ -69,29 +55,15 @@ module Symphonia
69
55
  end
70
56
  end
71
57
 
72
- # include helpers
73
58
  initializer :load_helper, before: :load_config_initializers do |app|
74
- # config.active_record.raise_in_transactional_callbacks = false
75
59
  if Rails.env.development?
76
60
  config.action_mailer.default_url_options ||= { host: 'symphonia.app' }
77
61
  config.action_mailer.preview_path = "{#{app.root.join('spec/mailers/previews')},#{root.join('spec/mailers/previews')}}"
78
62
  end
79
63
  end
80
64
 
81
- initializer :assets do |_app|
82
- config.assets.precompile << 'symphonia/application.css'
83
- #if defined?(::Ckeditor)
84
- # config.assets.precompile << 'ckeditor/**/*'
85
- # config.assets.precompile << 'symphonia/symphonia_ckeditor.js'
86
- #end
87
- end
88
-
89
- initializer :symphonia_general_permissions do |_app|
90
- Symphonia::Permissions.map do |m|
91
- m.register(:view_users).add(:users, %i[index show])
92
- m.register(:manage_users).add(:users, %i[create update destroy new edit])
93
- end
94
-
65
+ initializer :assets do |app|
66
+ app.config.assets.precompile << 'symphonia/application.css'
95
67
  end
96
68
 
97
69
  # initializer :wicked_pdf do |_app|