/
base_controller.rb
171 lines (146 loc) · 4.93 KB
/
base_controller.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# frozen_string_literal: true
module Alchemy
module Admin
class BaseController < Alchemy::BaseController
include Userstamp
include Locale
before_action { enforce_ssl if ssl_required? && !request.ssl? }
before_action :load_locked_pages
helper_method :clipboard_empty?, :trash_empty?, :get_clipboard, :is_admin?,
:options_from_params
check_authorization
rescue_from Exception do |exception|
if exception.is_a? CanCan::AccessDenied
permission_denied(exception)
elsif raise_exception?
raise
else
exception_handler(exception)
end
end
layout :set_layout
def leave
authorize! :leave, :alchemy_admin
render template: '/alchemy/admin/leave', layout: !request.xhr?
end
private
# Disable layout rendering for xhr requests.
def set_layout
request.xhr? ? false : 'alchemy/admin'
end
# Handles exceptions
def exception_handler(error)
exception_logger(error)
show_error_notice(error)
if defined?(Airbrake)
notify_airbrake(error) unless Rails.env.development? || Rails.env.test?
end
end
# Displays an error notice in the Alchemy backend.
def show_error_notice(error)
@error = error
# truncate the message, because very long error messages (i.e from mysql2) causes cookie overflow errors
@notice = error.message[0..255]
@trace = error.backtrace[0..50]
if request.xhr?
render action: "error_notice"
else
render '500', status: 500
end
end
# Returns clipboard items for given category
def get_clipboard(category)
session[:alchemy_clipboard] ||= {}
session[:alchemy_clipboard][category.to_s] ||= []
end
# Checks if clipboard for given category is blank
def clipboard_empty?(category)
get_clipboard(category).blank?
end
def trash_empty?(category)
"alchemy/#{category.singularize}".classify.constantize.trashed.blank?
end
def set_stamper
if Alchemy.user_class < ActiveRecord::Base
Alchemy.user_class.stamper = current_alchemy_user
end
end
def reset_stamper
if Alchemy.user_class < ActiveRecord::Base
Alchemy.user_class.reset_stamper
end
end
# Returns true if the current_alchemy_user (The logged-in Alchemy User) has the admin role.
def is_admin?
return false if !current_alchemy_user
current_alchemy_user.admin?
end
# Displays errors in a #errors div if any errors are present on the object.
# Or redirects to the given redirect url.
#
# @param object [ActiveRecord::Base]
# @param redirect_url [String]
# @param flash_notice [String]
#
def render_errors_or_redirect(object, redirect_url, flash_notice)
if object.errors.empty?
flash[:notice] = Alchemy.t(flash_notice)
do_redirect_to redirect_url
else
render action: (params[:action] == 'update' ? 'edit' : 'new')
end
end
def per_page_value_for_screen_size
Alchemy::Deprecation.warn("#per_page_value_for_screen_size is deprecated, please use #items_per_page instead")
return items_per_page if session[:screen_size].blank?
screen_height = session[:screen_size].split('x').last.to_i
(screen_height / 50) - 12
end
# Does redirects for html and js requests
#
def do_redirect_to(url_or_path)
respond_to do |format|
format.js {
@redirect_url = url_or_path
render :redirect
}
format.html { redirect_to url_or_path }
end
end
# Extracts options from params and permits all keys
#
# If no options are present it returns an empty parameters hash.
#
# @returns [ActionController::Parameters]
def options_from_params
@_options_from_params ||= begin
(params[:options] || ActionController::Parameters.new).permit!
end
end
# This method decides if we want to raise an exception or not.
#
# I.e. in test environment.
#
def raise_exception?
Rails.env.test? || is_page_preview?
end
# Are we currently in the page edit mode page preview.
def is_page_preview?
controller_path == 'alchemy/admin/pages' && action_name == 'show'
end
def load_locked_pages
@locked_pages = Page.locked_by(current_alchemy_user).order(:locked_at)
end
# Returns the current site for admin controllers.
#
def current_alchemy_site
@current_alchemy_site ||= begin
site_id = params[:site_id] || session[:alchemy_site_id]
site = Site.find_by(id: site_id) || super
session[:alchemy_site_id] = site.id
site
end
end
end
end
end