drg_cms 0.6.0.8 → 0.6.1.5
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.
- checksums.yaml +4 -4
- data/README.md +25 -10
- data/app/assets/javascripts/drg_cms/drg_cms.js +208 -81
- data/app/assets/stylesheets/drg_cms/drg_cms.css +298 -93
- data/app/assets/stylesheets/drg_cms/select-multiple.css +1 -1
- data/app/controllers/cmsedit_controller.rb +174 -167
- data/app/controllers/dc_application_controller.rb +230 -196
- data/app/controllers/dc_common_controller.rb +88 -50
- data/app/controls/dc_help_control.rb +138 -0
- data/app/controls/dc_report.rb +12 -16
- data/app/forms/all_options.yml +14 -5
- data/app/forms/cms_menu.yml +7 -1
- data/app/forms/dc_big_table.yml +0 -2
- data/app/forms/dc_big_table_value.yml +0 -2
- data/app/forms/dc_category.yml +2 -1
- data/app/forms/dc_design.yml +2 -2
- data/app/forms/dc_folder_permission.yml +0 -2
- data/app/forms/dc_help_1.yml +110 -0
- data/app/forms/dc_journal.yml +3 -1
- data/app/forms/dc_json_ld.yml +0 -3
- data/app/forms/dc_link.yml +1 -1
- data/app/forms/dc_menu.yml +8 -12
- data/app/forms/dc_menu_item.yml +2 -3
- data/app/forms/dc_page.yml +7 -2
- data/app/forms/dc_part.yml +1 -0
- data/app/forms/dc_piece.yml +1 -0
- data/app/forms/dc_policy.yml +2 -5
- data/app/forms/dc_poll.yml +13 -16
- data/app/forms/dc_seo.yml +1 -2
- data/app/forms/dc_simple_menu.yml +3 -2
- data/app/forms/dc_site.yml +5 -8
- data/app/forms/dc_user.yml +27 -11
- data/app/forms/dc_user_role.yml +3 -0
- data/app/helpers/cms_common_helper.rb +68 -4
- data/app/helpers/cms_edit_helper.rb +73 -55
- data/app/helpers/cms_helper.rb +70 -32
- data/app/helpers/cms_index_helper.rb +155 -102
- data/app/helpers/dc_application_helper.rb +132 -109
- data/app/models/concerns/dc_page_concern.rb +14 -4
- data/app/models/concerns/dc_piece_concern.rb +1 -1
- data/app/models/concerns/dc_policy_rule_concern.rb +20 -8
- data/app/models/concerns/dc_site_concern.rb +56 -44
- data/app/models/concerns/dc_user_concern.rb +58 -19
- data/app/models/dc_big_table.rb +2 -2
- data/app/models/dc_design.rb +29 -19
- data/app/models/dc_filter.rb +28 -22
- data/app/models/dc_key_value_store.rb +1 -0
- data/app/models/dc_permission.rb +19 -9
- data/app/models/dc_policy.rb +25 -14
- data/app/models/dc_policy_role.rb +22 -11
- data/app/models/dc_temp.rb +8 -1
- data/app/models/dc_user_role.rb +2 -2
- data/app/models/drgcms_form_fields/comment.rb +11 -2
- data/app/models/drgcms_form_fields/date_picker.rb +2 -0
- data/app/models/drgcms_form_fields/drgcms_field.rb +2 -1
- data/app/models/drgcms_form_fields/embedded.rb +9 -10
- data/app/models/drgcms_form_fields/file_field.rb +1 -1
- data/app/models/drgcms_form_fields/file_select.rb +2 -2
- data/app/models/drgcms_form_fields/hash_field.rb +11 -7
- data/app/models/drgcms_form_fields/link_to.rb +2 -2
- data/app/models/drgcms_form_fields/method.rb +5 -4
- data/app/models/drgcms_form_fields/multitext_autocomplete.rb +1 -1
- data/app/models/drgcms_form_fields/number_field.rb +4 -3
- data/app/models/drgcms_form_fields/readonly.rb +13 -17
- data/app/models/drgcms_form_fields/select.rb +24 -25
- data/app/models/drgcms_form_fields/text_autocomplete.rb +22 -14
- data/app/renderers/dc_page_renderer.rb +7 -6
- data/app/renderers/dc_poll_renderer.rb +16 -20
- data/app/views/cmsedit/_edit_stuff.html.erb +5 -2
- data/app/views/cmsedit/_form.html.erb +3 -2
- data/app/views/cmsedit/_result.html.erb +21 -18
- data/app/views/cmsedit/edit.html.erb +4 -1
- data/app/views/cmsedit/index.html.erb +3 -2
- data/app/views/cmsedit/new.html.erb +5 -2
- data/app/views/dc_common/_help.html.erb +17 -0
- data/app/views/layouts/models.html.erb +2 -1
- data/config/locales/drgcms_en.yml +17 -2
- data/config/locales/drgcms_sl.yml +20 -2
- data/config/locales/models_en.yml +7 -5
- data/config/locales/models_sl.yml +12 -9
- data/drg_cms.gemspec +16 -16
- data/lib/drg_cms/version.rb +1 -1
- data/lib/drg_cms.rb +94 -2
- metadata +32 -30
- data/app/models/__dc_dummy.rb +0 -102
@@ -1,4 +1,3 @@
|
|
1
|
-
#coding: utf-8
|
2
1
|
#--
|
3
2
|
# Copyright (c) 2012+ Damjan Rems
|
4
3
|
#
|
@@ -27,10 +26,10 @@
|
|
27
26
|
# application controllers.
|
28
27
|
##########################################################################
|
29
28
|
class DcApplicationController < ActionController::Base
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
29
|
+
protect_from_forgery with: :null_session, only: Proc.new { |c| c.request.format.json? }
|
30
|
+
before_action :dc_reload_patches if Rails.env.development?
|
31
|
+
before_action :dc_set_locale
|
32
|
+
|
34
33
|
########################################################################
|
35
34
|
# Writes anything passed as parameter to logger file.
|
36
35
|
# Very useful for debuging strange errors.
|
@@ -55,9 +54,9 @@ end
|
|
55
54
|
####################################################################
|
56
55
|
# Checks if user has required role.
|
57
56
|
#
|
58
|
-
# @param [DcPolicyRole] role can be passed as DcPolicyRole object or
|
59
|
-
#
|
60
|
-
#
|
57
|
+
# @param [DcPolicyRole or String] role can be passed as DcPolicyRole object or
|
58
|
+
# as role name. If passed as name, dc_policy_roles is searched for appropriate role.
|
59
|
+
#
|
61
60
|
# @return [Boolean] True if user has required role added to his profile.
|
62
61
|
#
|
63
62
|
# @example If user has required role
|
@@ -66,8 +65,8 @@ end
|
|
66
65
|
####################################################################
|
67
66
|
def dc_user_has_role(role)
|
68
67
|
role = DcPolicyRole.get_role(role)
|
69
|
-
return false if role.nil?
|
70
|
-
# role
|
68
|
+
return false if role.nil? || session[:user_roles].nil?
|
69
|
+
# role exists in user_roles
|
71
70
|
session[:user_roles].include?(role._id)
|
72
71
|
end
|
73
72
|
|
@@ -81,22 +80,28 @@ end
|
|
81
80
|
# @example Returns Google analytics code from site settings
|
82
81
|
# settings = dc_get_site.params['ga_acc']
|
83
82
|
####################################################################
|
84
|
-
def dc_get_site
|
85
|
-
return @site if @site
|
83
|
+
def dc_get_site
|
84
|
+
return @site if @site
|
85
|
+
|
86
86
|
uri = URI.parse(request.url)
|
87
|
+
cache_key = ['dc_site', uri.host]
|
88
|
+
|
89
|
+
@site = dc_cache_read(cache_key)
|
90
|
+
return @site if @site
|
91
|
+
|
87
92
|
@site = DcSite.find_by(name: uri.host)
|
88
|
-
# Site can be aliased
|
89
|
-
if @site
|
93
|
+
# Site can be aliased
|
94
|
+
if @site && !@site.alias_for.blank?
|
90
95
|
@site = DcSite.find_by(name: @site.alias_for)
|
91
96
|
end
|
92
|
-
# Development environment. Check if site with name test exists and use
|
93
|
-
# alias_for as pointer to real site.
|
94
|
-
if @site.nil?
|
97
|
+
# Development environment. Check if site with name test exists and use
|
98
|
+
# alias_for as pointer to real site.
|
99
|
+
if @site.nil? && ENV["RAILS_ENV"] != 'production'
|
95
100
|
@site = DcSite.find_by(name: 'test')
|
96
101
|
@site = DcSite.find_by(name: @site.alias_for) if @site
|
97
|
-
end
|
98
|
-
@site = nil if @site
|
99
|
-
@site
|
102
|
+
end
|
103
|
+
@site = nil if @site && !@site.active # site is disabled
|
104
|
+
dc_cache_write(cache_key, @site)
|
100
105
|
end
|
101
106
|
|
102
107
|
##########################################################################
|
@@ -104,7 +109,7 @@ end
|
|
104
109
|
#
|
105
110
|
# Sets internal @page_title variable.
|
106
111
|
##########################################################################
|
107
|
-
def set_page_title
|
112
|
+
def set_page_title
|
108
113
|
@page_title = @page.title.blank? ? @page.subject : @page.title
|
109
114
|
dc_add_meta_tag(:name, 'description', @page.meta_description)
|
110
115
|
end
|
@@ -115,18 +120,17 @@ end
|
|
115
120
|
# @param [String] Form file name. File name can be passed as gem_name.filename. This can
|
116
121
|
# be useful when you are extending form but want to retain same name as original form
|
117
122
|
# For example. You are extending dc_user form from drg_cms gem and want to
|
118
|
-
# retain same dc_user name. This can be done by setting drg_cms.dc_user
|
123
|
+
# retain same dc_user name. This can be done by setting drg_cms.dc_user as extend option.
|
119
124
|
#
|
120
125
|
# @return [String] Form file name including path or nil if not found.
|
121
126
|
########################################################################
|
122
127
|
def dc_find_form_file(form_file)
|
123
|
-
form_path=nil
|
124
|
-
if form_file.match(/\.|\//)
|
125
|
-
|
126
|
-
end
|
128
|
+
form_path = nil
|
129
|
+
form_path, form_file = form_file.split(/\.|\//) if form_file.match(/\.|\//)
|
130
|
+
|
127
131
|
DrgCms.paths(:forms).reverse.each do |path|
|
128
132
|
f = "#{path}/#{form_file}.yml"
|
129
|
-
return f if File.exist?(f)
|
133
|
+
return f if File.exist?(f) && (form_path.nil? || path.to_s.match(/\/#{form_path}(-|\/)/i))
|
130
134
|
end
|
131
135
|
raise "Exception: Form file '#{form_file}' not found!"
|
132
136
|
end
|
@@ -149,7 +153,7 @@ end
|
|
149
153
|
# Will write document to dc_visits collection unless visit comes from robot.
|
150
154
|
# It also sets session[is_robot] variable to true if robot.
|
151
155
|
########################################################################
|
152
|
-
def dc_log_visit
|
156
|
+
def dc_log_visit
|
153
157
|
if request.env["HTTP_USER_AGENT"] and request.env["HTTP_USER_AGENT"].match(/\(.*https?:\/\/.*\)/)
|
154
158
|
logger.info "ROBOT: #{Time.now.strftime('%Y.%m.%d %H:%M:%S')} id=#{@page.id} ip=#{request.remote_ip}."
|
155
159
|
session[:is_robot] = true
|
@@ -165,73 +169,79 @@ end
|
|
165
169
|
|
166
170
|
protected
|
167
171
|
|
168
|
-
|
169
|
-
# Add permissions. Subroutine of dc_user_can
|
170
|
-
############################################################################
|
171
|
-
def __add_permissions_for(table_name=nil) # :nodoc:
|
172
|
-
perm = table_name.nil? ? DcPermission.find_by(is_default: true) : DcPermission.find_by(table_name: table_name, active: true)
|
173
|
-
(perm.dc_policy_rules.each {|p1| @permissions[p1.dc_policy_role_id] = p1.permission }) if perm
|
174
|
-
end
|
175
|
-
|
176
|
-
############################################################################
|
172
|
+
###########################################################################
|
177
173
|
# Checks if user can perform (read, create, edit, delete) document in specified
|
178
174
|
# table (collection).
|
179
175
|
#
|
180
|
-
# @param [Integer] Required permission level
|
181
|
-
# @param [String] Collection (table) name for which permission is queried. Defaults to params[table].
|
176
|
+
# @param [Integer] permission: Required permission level
|
177
|
+
# @param [String] table: Collection (table) name for which permission is queried. Defaults to params[table].
|
182
178
|
#
|
183
179
|
# @return [Boolean] true if user's role permits (is higher or equal then required) operation on a table (collection).
|
184
180
|
#
|
185
181
|
# @Example True when user has view permission on the table
|
186
182
|
# if dc_user_can(DcPermission::CAN_VIEW, params[:table]) then ...
|
187
183
|
############################################################################
|
188
|
-
def
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
table_name << (table_name.size > 0 ? ';' : '') + t # table;embedded;another;...
|
196
|
-
add_permissions_for table_name
|
197
|
-
end
|
184
|
+
def dc_user_can(permission, table = params[:table])
|
185
|
+
table = table.underscore
|
186
|
+
cache_key = ['dc_permission', table, session[:user_id], dc_get_site.id]
|
187
|
+
permissions = dc_cache_read(cache_key)
|
188
|
+
if permissions.nil?
|
189
|
+
permissions = DcPermission.permissions_for_table(table)
|
190
|
+
dc_cache_write(cache_key, permissions)
|
198
191
|
end
|
199
|
-
|
200
|
-
session[:user_roles].each {|r| return true if @permissions[r] and @permissions[r] >= permission }
|
192
|
+
session[:user_roles].each { |r| return true if permissions[r] && permissions[r] >= permission }
|
201
193
|
false
|
202
|
-
end
|
194
|
+
end
|
203
195
|
|
204
|
-
|
205
|
-
#
|
206
|
-
#
|
207
|
-
#
|
208
|
-
#
|
209
|
-
# @
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
false
|
196
|
+
####################################################################
|
197
|
+
# Read from cache
|
198
|
+
#
|
199
|
+
# @keys [Array] Array of keys
|
200
|
+
#
|
201
|
+
# @return [Object] Data returned from cache
|
202
|
+
####################################################################
|
203
|
+
def dc_cache_read(keys)
|
204
|
+
if redis_cache_store?
|
205
|
+
keys = keys.dup
|
206
|
+
first = keys.shift
|
207
|
+
data = redis.hget(first, keys.join(''))
|
208
|
+
data ? Marshal.load(data) : nil
|
209
|
+
else
|
210
|
+
Rails.cache.read(keys.join(''))
|
211
|
+
end
|
221
212
|
end
|
222
213
|
|
223
214
|
####################################################################
|
224
|
-
#
|
215
|
+
# Write data to cache
|
216
|
+
#
|
217
|
+
# @param [Array] keys: Array of keys
|
218
|
+
# @param [Object] data: Data written to cache
|
219
|
+
#
|
220
|
+
# @return [Object] data so dc_cache_write can be used as last statement in method.
|
221
|
+
####################################################################
|
222
|
+
def dc_cache_write(keys, data)
|
223
|
+
if redis_cache_store?
|
224
|
+
keys = keys.dup
|
225
|
+
first = keys.shift
|
226
|
+
redis.hset(first, keys.join(''), Marshal.dump(data))
|
227
|
+
else
|
228
|
+
Rails.cache.write(keys.join(''), data)
|
229
|
+
end
|
230
|
+
data
|
231
|
+
end
|
232
|
+
|
233
|
+
####################################################################
|
234
|
+
# Detects if called from mobile agent according to http://detectmobilebrowsers.com/
|
225
235
|
# and set session[:is_mobile]
|
226
|
-
#
|
236
|
+
#
|
227
237
|
# Detect also if caller is a robot and set session[:is_robot]
|
228
238
|
####################################################################
|
229
239
|
def dc_set_is_mobile
|
230
240
|
is_mobile = request.user_agent ? /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.match(request.user_agent) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.match(request.user_agent[0..3])
|
231
241
|
: false
|
232
242
|
session[:is_mobile] = is_mobile ? 1 : 0
|
233
|
-
|
234
|
-
if request.env["HTTP_USER_AGENT"]
|
243
|
+
|
244
|
+
if request.env["HTTP_USER_AGENT "] && request.env["HTTP_USER_AGENT"].match(/\(.*https?:\/\/.*\)/)
|
235
245
|
logger.info "ROBOT: #{Time.now.strftime('%Y.%m.%d %H:%M:%S')} id=#{@page.id} ip=#{request.remote_ip}."
|
236
246
|
session[:is_robot] = true
|
237
247
|
end
|
@@ -240,23 +250,13 @@ end
|
|
240
250
|
##########################################################################
|
241
251
|
# Merge values from parameters fields (from site, page ...) into internal @options hash.
|
242
252
|
#
|
243
|
-
# @param [String] YAML string.
|
253
|
+
# @param [String] parameters: passed as YAML string.
|
244
254
|
##########################################################################
|
245
255
|
def dc_set_options(parameters)
|
246
256
|
@options ||= {}
|
247
257
|
return if parameters.to_s.size < 3
|
248
|
-
# parameters are set
|
249
|
-
parms = YAML.load(parameters) rescue
|
250
|
-
if parms.nil? # error when loadnig yaml, try the old way parsing manually
|
251
|
-
parms = {}
|
252
|
-
parameters.split("\n").each do |line|
|
253
|
-
line.chomp.split(',').each do |parm|
|
254
|
-
key, value = parm.split(':')
|
255
|
-
value = value.to_s.strip.gsub(/\'|\"/,'')
|
256
|
-
parms[key.strip] = (value == '/' ? nil : value)
|
257
|
-
end
|
258
|
-
end
|
259
|
-
end
|
258
|
+
# parameters are set as YAML. This should be default in future.
|
259
|
+
parms = YAML.load(parameters) rescue {}
|
260
260
|
@options.merge!(parms)
|
261
261
|
end
|
262
262
|
|
@@ -270,7 +270,6 @@ end
|
|
270
270
|
# @return [Boolean] true when none of documents is changed.
|
271
271
|
##########################################################################
|
272
272
|
def dc_not_modified?(*documents)
|
273
|
-
# request.env.each {|k,v| p k,'*',v}
|
274
273
|
return false unless request.env.include? 'HTTP_IF_MODIFIED_SINCE'
|
275
274
|
|
276
275
|
since_date = Time.parse request.env['HTTP_IF_MODIFIED_SINCE']
|
@@ -279,7 +278,7 @@ def dc_not_modified?(*documents)
|
|
279
278
|
next unless doc.respond_to?(:updated_at)
|
280
279
|
last_modified = doc.updated_at if doc.updated_at > last_modified
|
281
280
|
end
|
282
|
-
|
281
|
+
|
283
282
|
if last_modified >= since_date then
|
284
283
|
render :nothing => true, :status => 304
|
285
284
|
return true
|
@@ -298,16 +297,16 @@ def get_design_and_render(design_doc)
|
|
298
297
|
layout = @site.site_layout.blank? ? 'content' : @site.site_layout
|
299
298
|
site_top = '<%= dc_page_top %>'
|
300
299
|
site_bottom = '<%= dc_page_bottom %>'
|
301
|
-
# lets try the rails way
|
302
|
-
if @options[:control]
|
300
|
+
# lets try the rails way
|
301
|
+
if @options[:control] && @options[:action]
|
303
302
|
controller = "#{@options[:control]}_control".classify.constantize rescue nil
|
304
303
|
extend controller if controller
|
305
304
|
return send @options[:action] if respond_to?(@options[:action])
|
306
305
|
end
|
307
|
-
# design doc present
|
306
|
+
# design doc present
|
308
307
|
if design_doc
|
309
308
|
# defined as rails view
|
310
|
-
design = if design_doc.rails_view.blank?
|
309
|
+
design = if design_doc.rails_view.blank? || design_doc.rails_view == 'site'
|
311
310
|
@site.rails_view
|
312
311
|
else
|
313
312
|
design_doc.rails_view
|
@@ -318,8 +317,8 @@ def get_design_and_render(design_doc)
|
|
318
317
|
design = site_top + design + site_bottom
|
319
318
|
return render(inline: design, layout: layout) unless design.blank?
|
320
319
|
end
|
321
|
-
# Design doc not defined
|
322
|
-
if @site.rails_view.blank?
|
320
|
+
# Design doc not defined
|
321
|
+
if @site.rails_view.blank?
|
323
322
|
design = site_top + @site.design + site_bottom
|
324
323
|
render(inline: design, layout: layout)
|
325
324
|
else
|
@@ -341,34 +340,35 @@ end
|
|
341
340
|
# dc_process_default_request
|
342
341
|
# end
|
343
342
|
##########################################################################
|
344
|
-
def dc_process_default_request
|
343
|
+
def dc_process_default_request
|
345
344
|
session[:edit_mode] ||= 0
|
346
|
-
# Initialize parts
|
345
|
+
# Initialize parts
|
347
346
|
@parts = nil
|
348
347
|
@js, @css = '', ''
|
349
|
-
# find domain name in sites
|
348
|
+
# find domain name in sites
|
350
349
|
@site = dc_get_site
|
351
|
-
# site not defined. render 404 error
|
350
|
+
# site not defined. render 404 error
|
352
351
|
return dc_render_404('Site!') if @site.nil?
|
352
|
+
|
353
353
|
dc_set_options(@site.settings)
|
354
|
-
# HOMEPAGE. When no parameters is set
|
354
|
+
# HOMEPAGE. When no parameters is set
|
355
355
|
params[:path] = @site.homepage_link if params[:id].nil? and params[:path].nil?
|
356
356
|
@options[:path] = params[:path].to_s.downcase.split('/')
|
357
357
|
params[:path] = @options[:path].first if @options[:path].size > 1
|
358
|
-
# some other process request. It should fail if not defined
|
358
|
+
# some other process request. It should fail if not defined
|
359
359
|
return send(@site.request_processor) unless @site.request_processor.blank?
|
360
360
|
|
361
|
-
# Search for page
|
361
|
+
# Search for page
|
362
362
|
pageclass = @site.page_klass
|
363
363
|
if params[:id]
|
364
364
|
#Page.where(id: params[:id]).or(subject_link: params[:id]).first
|
365
365
|
@page = pageclass.find_by(:dc_site_id.in => [@site._id, nil], subject_link: params[:id], active: true)
|
366
366
|
@page = pageclass.find(params[:id]) if @page.nil? # I think that there will be more subject_link searchers than id
|
367
367
|
elsif params[:path]
|
368
|
-
# path may point direct to page's subject_link
|
368
|
+
# path may point direct to page's subject_link
|
369
369
|
@page = pageclass.find_by(:dc_site_id.in => [@site._id, nil], subject_link: params[:path], active: true)
|
370
370
|
if @page.nil?
|
371
|
-
# no. Find if defined in links
|
371
|
+
# no. Find if defined in links
|
372
372
|
link = DcLink.find_by(:dc_site_id.in => [@site._id, nil], name: params[:path])
|
373
373
|
if link
|
374
374
|
#pageclass.find_by(alt_link: params[:path])
|
@@ -377,10 +377,11 @@ def dc_process_default_request()
|
|
377
377
|
end
|
378
378
|
end
|
379
379
|
end
|
380
|
-
# if @page is not found render 404 error
|
380
|
+
# if @page is not found render 404 error
|
381
381
|
return dc_render_404('Page!') unless @page
|
382
|
+
|
382
383
|
dc_set_is_mobile unless session[:is_mobile] # do it only once per session
|
383
|
-
# find design if defined. Otherwise design MUST be declared in site
|
384
|
+
# find design if defined. Otherwise design MUST be declared in site
|
384
385
|
if @page.dc_design_id
|
385
386
|
@design = DcDesign.find(@page.dc_design_id)
|
386
387
|
return dc_render_404('Design!') unless @design
|
@@ -388,20 +389,20 @@ def dc_process_default_request()
|
|
388
389
|
dc_set_options @design.params if @design
|
389
390
|
dc_set_options @page.params
|
390
391
|
dc_add_json_ld(@page.get_json_ld)
|
391
|
-
# Add edit menu
|
392
|
+
# Add edit menu
|
392
393
|
if session[:edit_mode] > 0
|
393
394
|
session[:site_id] = @site.id
|
394
395
|
session[:site_page_class] = @site.page_class
|
395
396
|
session[:page_id] = @page.id
|
396
|
-
else
|
397
|
-
# Log only visits from non-editors
|
397
|
+
else
|
398
|
+
# Log only visits from non-editors
|
398
399
|
dc_log_visit()
|
399
400
|
end
|
400
401
|
set_page_title()
|
401
402
|
get_design_and_render @design
|
402
403
|
end
|
403
404
|
|
404
|
-
|
405
|
+
###########################################################################
|
405
406
|
# Single site document kind of request handler.
|
406
407
|
#
|
407
408
|
# This request handler assumes that all data for the site is saved in the site document.
|
@@ -417,18 +418,17 @@ def dc_single_sitedoc_request
|
|
417
418
|
if @site.nil?
|
418
419
|
session[:edit_mode] ||= 0
|
419
420
|
@site = dc_get_site
|
420
|
-
|
421
|
+
# @site is not defined. render 404 error
|
421
422
|
return dc_render_404('Site!') unless @site
|
423
|
+
|
422
424
|
dc_set_options(@site.settings)
|
423
425
|
end
|
424
|
-
# HOMEPAGE. When no parameters is set
|
426
|
+
# HOMEPAGE. When no parameters is set
|
425
427
|
params[:path] = @site.homepage_link if params[:path].nil?
|
426
428
|
@parts = @site.dc_parts
|
427
429
|
@part = @parts.find_by(link: params[:path])
|
428
430
|
return dc_render_404('Part!') unless @part
|
429
|
-
|
430
|
-
# return if dc_not_modified?(@site, @part)
|
431
|
-
#
|
431
|
+
|
432
432
|
@page_title = "#{@site.page_title} #{@part.name}"
|
433
433
|
@js, @css = '', ''
|
434
434
|
get_design_and_render nil
|
@@ -439,46 +439,36 @@ end
|
|
439
439
|
# very good with non ascii chars. Since this method is used for converting from model
|
440
440
|
# to collection names it is very unwise to use non ascii chars for table (collection) names.
|
441
441
|
#
|
442
|
-
# @param [
|
443
|
-
#
|
442
|
+
# @param [Object] model_string to be converted
|
443
|
+
#
|
444
444
|
# @example
|
445
445
|
# decamelize_type(ModelName) # 'ModelName' => 'model_name'
|
446
446
|
########################################################################
|
447
|
-
def decamelize_type(
|
448
|
-
|
449
|
-
r = ''
|
450
|
-
string.to_s.each_char do |c|
|
451
|
-
r << case
|
452
|
-
when r.size == 0 then c.downcase
|
453
|
-
when c.downcase != c then '_' + c.downcase
|
454
|
-
else c
|
455
|
-
end
|
456
|
-
end
|
457
|
-
r
|
447
|
+
def decamelize_type(model_string)
|
448
|
+
model_string ? model_string.underscore : nil
|
458
449
|
end
|
459
450
|
|
460
451
|
####################################################################
|
461
452
|
# Return's error messages for the document formated for display on edit form.
|
462
453
|
#
|
463
|
-
# @param [Document]
|
464
|
-
#
|
454
|
+
# @param [Document] document object which will be examined for errors.
|
455
|
+
#
|
465
456
|
# @return [String] HTML code for displaying error on edit form.
|
466
457
|
####################################################################
|
467
458
|
def dc_error_messages_for(document)
|
468
459
|
return '' unless document.errors.any?
|
460
|
+
|
469
461
|
msg = ''
|
470
|
-
document.errors.each do |
|
471
|
-
label = t("helpers.label.#{decamelize_type(document.class)}.#{attribute}")
|
472
|
-
msg << "<li>#{label} : #{
|
462
|
+
document.errors.each do |error|
|
463
|
+
label = t("helpers.label.#{decamelize_type(document.class)}.#{error.attribute}", error.attribute)
|
464
|
+
msg << "<li>#{label} : #{error.message}</li>"
|
473
465
|
end
|
474
466
|
|
475
|
-
|
467
|
+
%(
|
476
468
|
<div class="dc-form-error">
|
477
469
|
<h2>#{t('drgcms.errors_no')} #{document.errors.size}</h2>
|
478
470
|
<ul>#{msg}</ul>
|
479
|
-
</div>
|
480
|
-
eot
|
481
|
-
html.html_safe
|
471
|
+
</div>).html_safe
|
482
472
|
end
|
483
473
|
|
484
474
|
####################################################################
|
@@ -487,8 +477,8 @@ end
|
|
487
477
|
# model errors or when saving to multiple collections and where each save must be
|
488
478
|
# checked if succesfull.
|
489
479
|
#
|
490
|
-
# @param [Document] Document object
|
491
|
-
# @param [Boolean] If true method should end in runtime error. Default = false.
|
480
|
+
# @param [Document] document: Document object to be checked
|
481
|
+
# @param [Boolean] crash: If true method should end in runtime error. Default = false.
|
492
482
|
#
|
493
483
|
# @return [String] Error messages or empty string if everything is OK.
|
494
484
|
#
|
@@ -500,16 +490,16 @@ end
|
|
500
490
|
# end
|
501
491
|
#
|
502
492
|
####################################################################
|
503
|
-
def dc_check_model(document, crash=false)
|
504
|
-
|
493
|
+
def dc_check_model(document, crash = false)
|
494
|
+
DrgCms.model_check(document, crash)
|
505
495
|
end
|
506
496
|
|
507
497
|
######################################################################
|
508
498
|
# Call rake task from controller.
|
509
499
|
#
|
510
|
-
# @param [String] Rake task name
|
511
|
-
# @param [Hash] Options that will be send to task as environment variables
|
512
|
-
#
|
500
|
+
# @param [String] task: Rake task name
|
501
|
+
# @param [Hash] options: Options that will be send to task as environment variables
|
502
|
+
#
|
513
503
|
# @example Call rake task from application
|
514
504
|
# dc_call_rake('clear:all', some_parm: some_id)
|
515
505
|
######################################################################
|
@@ -524,8 +514,8 @@ end
|
|
524
514
|
# made from DRG CMS form return may be quite complicated. All ajax return combinations
|
525
515
|
# can be found in drg_cms.js file.
|
526
516
|
#
|
527
|
-
# @param [Hash] Options
|
528
|
-
#
|
517
|
+
# @param [Hash] opts: Options
|
518
|
+
#
|
529
519
|
# @return [JSON Response] Formatted to be used for ajax return.
|
530
520
|
#
|
531
521
|
# @example
|
@@ -537,7 +527,7 @@ end
|
|
537
527
|
######################################################################
|
538
528
|
def dc_render_ajax(opts)
|
539
529
|
result = {}
|
540
|
-
if opts[:div]
|
530
|
+
if opts[:div] || opts[:class]
|
541
531
|
selector = opts[:div] ? '#' : '.' # for div . for class
|
542
532
|
key = case
|
543
533
|
when opts[:prepend] then "#{selector}+div"
|
@@ -559,7 +549,7 @@ end
|
|
559
549
|
# @param [String] Table (collection) name. Could be dc_page;dc_part;... when searching for embedded document.
|
560
550
|
# @param [String] Id of the document
|
561
551
|
# @param [String] Ids of parent documents when document is embedded. Ids are separated by ; char.
|
562
|
-
#
|
552
|
+
#
|
563
553
|
# @return [document]. Required document or nil if not found.
|
564
554
|
#
|
565
555
|
# @example As used in Cmsedit_controller
|
@@ -589,6 +579,20 @@ def dc_reload_patches
|
|
589
579
|
end
|
590
580
|
end
|
591
581
|
|
582
|
+
########################################################################
|
583
|
+
# Will set new default locale for application
|
584
|
+
#
|
585
|
+
# @param [String] new_locale : New locale value. If omitted it will be provided from params[:locale].
|
586
|
+
# if new_locale value is 00, application's default_locale will be used.
|
587
|
+
########################################################################
|
588
|
+
def dc_set_locale(new_locale = nil)
|
589
|
+
new_locale ||= params[:locale]
|
590
|
+
if new_locale && new_locale != session[:locale]
|
591
|
+
session[:locale] = new_locale == '00' ? nil : new_locale.to_sym
|
592
|
+
end
|
593
|
+
I18n.locale = session[:locale] ? session[:locale] : I18n.default_locale
|
594
|
+
end
|
595
|
+
|
592
596
|
############################################################################
|
593
597
|
# Writes out deprication msg. It also adds site_name to message, so it is easier to
|
594
598
|
# find where the message is comming from.
|
@@ -604,7 +608,7 @@ def clear_login_data
|
|
604
608
|
session[:edit_mode] = 0
|
605
609
|
session[:user_id] = nil
|
606
610
|
session[:user_name] = nil
|
607
|
-
|
611
|
+
set_default_guest_user_role
|
608
612
|
cookies.delete :remember_me
|
609
613
|
end
|
610
614
|
|
@@ -622,32 +626,48 @@ end
|
|
622
626
|
# @param [DcUser] user : User's document
|
623
627
|
# @param [Boolean] remember_me : false by default
|
624
628
|
####################################################################
|
625
|
-
def fill_login_data(user, remember_me=false)
|
626
|
-
session[:user_id]
|
627
|
-
session[:user_name]
|
628
|
-
session[:edit_mode]
|
629
|
-
session[:user_roles] = []
|
630
|
-
# Every user has guest role
|
631
|
-
# guest = DcPolicyRole.find_by(system_name: 'guest')
|
632
|
-
# session[:user_roles] << guest.id if guest
|
629
|
+
def fill_login_data(user, remember_me = false)
|
630
|
+
session[:user_id] = user.id if user
|
631
|
+
session[:user_name] = user.name.squish if user
|
632
|
+
session[:edit_mode] = 0
|
633
633
|
set_default_guest_user_role
|
634
|
-
return unless user
|
634
|
+
return unless user&.active
|
635
|
+
|
635
636
|
# special for SUPERADMIN
|
636
637
|
sa = DcPolicyRole.find_by(system_name: 'superadmin')
|
637
|
-
if sa
|
638
|
+
if sa && (role = user.dc_user_roles.find_by(dc_policy_role_id: sa.id))
|
638
639
|
session[:user_roles] << role.dc_policy_role_id
|
639
|
-
session[:edit_mode]
|
640
|
+
session[:edit_mode] = 2
|
640
641
|
return
|
641
642
|
end
|
642
|
-
# read default policy from site. Policy might be inherited
|
643
|
+
# read default policy from site. Policy might be inherited from other site
|
643
644
|
policy_site = dc_get_site()
|
644
645
|
policy_site = DcSite.find(policy_site.inherit_policy) if policy_site.inherit_policy
|
645
646
|
default_policy = policy_site.dc_policies.find_by(is_default: true)
|
646
|
-
|
647
|
+
|
648
|
+
# load user roles from groups
|
649
|
+
roles = {}
|
650
|
+
user.member.each do |group_id|
|
651
|
+
group = DcUser.find(group_id)
|
652
|
+
next unless group.active
|
653
|
+
|
654
|
+
group.dc_user_roles.each do |role|
|
655
|
+
next unless role.active?
|
656
|
+
roles[role.dc_policy_role_id] = role
|
657
|
+
end
|
658
|
+
end unless user.member.blank?
|
659
|
+
|
660
|
+
# load user roles from user
|
647
661
|
user.dc_user_roles.each do |role|
|
648
|
-
|
649
|
-
|
650
|
-
|
662
|
+
# not active in user roles will remove role defined in groups
|
663
|
+
unless role.active?
|
664
|
+
roles.delete(role.dc_policy_role_id) if roles[role.dc_policy_role_id]
|
665
|
+
next
|
666
|
+
end
|
667
|
+
roles[role.dc_policy_role_id] = role
|
668
|
+
end
|
669
|
+
# select only roles defined in default site policy and set edit_mode
|
670
|
+
roles.each do |key, role|
|
651
671
|
# check if role is active in this site
|
652
672
|
policy_role = default_policy.dc_policy_rules.find_by(dc_policy_role_id: role.dc_policy_role_id)
|
653
673
|
next unless policy_role
|
@@ -656,20 +676,19 @@ def fill_login_data(user, remember_me=false)
|
|
656
676
|
session[:user_roles] << role.dc_policy_role_id
|
657
677
|
end
|
658
678
|
# Save remember me cookie if not CMS user and remember me is selected
|
659
|
-
if session[:edit_mode] == 0
|
660
|
-
cookies.signed[:remember_me] = { :
|
679
|
+
if session[:edit_mode] == 0 && remember_me
|
680
|
+
cookies.signed[:remember_me] = { value: user.id, expires: 180.days.from_now }
|
661
681
|
end
|
662
682
|
end
|
663
683
|
|
664
684
|
##########################################################################
|
665
|
-
# Will check if user's login data is
|
685
|
+
# Will check if user's login data is still valid and reload user roles.
|
666
686
|
#
|
667
687
|
# @param [Time] repeat_after : Check is repeated after time. This is by default performed every 24 hours.
|
668
688
|
##########################################################################
|
669
|
-
def dc_check_user_still_valid(repeat_after=1.day)
|
670
|
-
|
671
|
-
|
672
|
-
# last check more than a day ago
|
689
|
+
def dc_check_user_still_valid(repeat_after = 1.day)
|
690
|
+
return if session[:user_id].nil?
|
691
|
+
# last check more than repeat_after ago
|
673
692
|
if (session[:user_chk] ||= Time.now) < repeat_after.ago
|
674
693
|
user_id = session[:user_id]
|
675
694
|
clear_login_data
|
@@ -684,9 +703,9 @@ end
|
|
684
703
|
# Evaluates Class.method in more predictable context then just calling eval
|
685
704
|
#
|
686
705
|
# @param [String] class_method defined as MyClass.method_name
|
687
|
-
# @param [Object] optional parameters send to class_method
|
706
|
+
# @param [Object] params: optional parameters send to class_method
|
688
707
|
##########################################################################
|
689
|
-
def dc_eval_class_method(class_method, params=nil)
|
708
|
+
def dc_eval_class_method(class_method, params = nil)
|
690
709
|
klass, method = class_method.split('.')
|
691
710
|
# check if class exists
|
692
711
|
klass = klass.classify.constantize rescue nil
|
@@ -729,25 +748,33 @@ end
|
|
729
748
|
########################################################################
|
730
749
|
def dc_add_meta_tag(type, name, content)
|
731
750
|
return if content.blank?
|
751
|
+
|
732
752
|
@meta_tags ||= {}
|
733
753
|
key = "#{type}=\"#{name}\""
|
734
754
|
@meta_tags[key] = content
|
735
755
|
end
|
736
756
|
|
737
757
|
########################################################################
|
738
|
-
# Will prepare flash[:update] data, which
|
739
|
-
# on
|
740
|
-
#
|
741
|
-
# Parameters:
|
742
|
-
# [
|
758
|
+
# Will prepare flash[:update] data, which is used for updating elements
|
759
|
+
# on parent form.
|
760
|
+
#
|
761
|
+
# Parameters passed as hash:
|
762
|
+
# [field] String: Field name
|
763
|
+
# [head] String: Filed name in head of form
|
743
764
|
# [value] String: New value
|
744
765
|
# [readonly] Boolean: Field is readonly
|
745
|
-
#
|
766
|
+
#
|
746
767
|
########################################################################
|
747
|
-
def
|
748
|
-
|
768
|
+
def dc_update_form_element(field: nil, head: nil, value:, readonly: true)
|
769
|
+
key = if field
|
770
|
+
(readonly ? 'td_' : '') + "record_#{field}"
|
771
|
+
elsif head
|
772
|
+
"head-#{head}"
|
773
|
+
end
|
774
|
+
return if key.nil?
|
775
|
+
|
749
776
|
flash[:update] ||= {}
|
750
|
-
flash[:update][
|
777
|
+
flash[:update][key] = value
|
751
778
|
end
|
752
779
|
|
753
780
|
####################################################################
|
@@ -769,20 +796,8 @@ end
|
|
769
796
|
# end
|
770
797
|
#
|
771
798
|
####################################################################
|
772
|
-
def self.dc_check_model(document, crash=false)
|
773
|
-
|
774
|
-
msg = ""
|
775
|
-
document.errors.each do |attribute, errors_array|
|
776
|
-
msg << "#{attribute}: #{errors_array}\n"
|
777
|
-
end
|
778
|
-
#
|
779
|
-
if crash and msg.size > 0
|
780
|
-
msg = "Validation errors in #{document.class}:\n" + msg
|
781
|
-
pp msg
|
782
|
-
Rails.logger.error(msg)
|
783
|
-
raise "Validation error. See log for more information."
|
784
|
-
end
|
785
|
-
msg
|
799
|
+
def self.dc_check_model(document, crash = false)
|
800
|
+
DrgCms.model_check(document, crash)
|
786
801
|
end
|
787
802
|
|
788
803
|
########################################################################
|
@@ -798,5 +813,24 @@ def dc_dump_exception(exception)
|
|
798
813
|
Rails.logger.error msg
|
799
814
|
end
|
800
815
|
|
816
|
+
private
|
817
|
+
|
818
|
+
########################################################################
|
819
|
+
# Determines if redis cache store is active
|
820
|
+
#
|
821
|
+
# @return [Boolean] : True if redis cache store is active
|
822
|
+
########################################################################
|
823
|
+
def redis_cache_store?
|
824
|
+
(Rails.application.config.cache_store.first == :redis_cache_store) rescue false
|
825
|
+
end
|
826
|
+
|
827
|
+
########################################################################
|
828
|
+
# Returns redis object
|
829
|
+
#
|
830
|
+
# @return [Object] : Redis object
|
831
|
+
########################################################################
|
832
|
+
def redis
|
833
|
+
Rails.cache.redis
|
834
|
+
end
|
801
835
|
|
802
836
|
end
|