drg_cms 0.6.0.8 → 0.6.1.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.
- checksums.yaml +4 -4
- data/app/assets/javascripts/drg_cms/drg_cms.js +100 -58
- data/app/assets/stylesheets/drg_cms/drg_cms.css +177 -43
- data/app/controllers/cmsedit_controller.rb +149 -145
- data/app/controllers/dc_application_controller.rb +235 -113
- data/app/controllers/dc_common_controller.rb +32 -3
- data/app/controls/dc_help_control.rb +126 -0
- data/app/controls/dc_report.rb +5 -7
- data/app/forms/all_options.yml +10 -4
- data/app/forms/cms_menu.yml +7 -1
- data/app/forms/dc_category.yml +2 -1
- data/app/forms/dc_design.yml +1 -0
- data/app/forms/dc_help_1.yml +109 -0
- data/app/forms/dc_journal.yml +3 -1
- data/app/forms/dc_link.yml +1 -1
- data/app/forms/dc_menu.yml +2 -0
- data/app/forms/dc_menu_item.yml +1 -0
- data/app/forms/dc_page.yml +2 -0
- data/app/forms/dc_part.yml +1 -0
- data/app/forms/dc_piece.yml +1 -0
- data/app/forms/dc_poll.yml +3 -0
- data/app/forms/dc_simple_menu.yml +2 -0
- data/app/forms/dc_site.yml +2 -6
- data/app/forms/dc_user.yml +27 -11
- data/app/forms/dc_user_role.yml +3 -0
- data/app/helpers/cms_common_helper.rb +69 -4
- data/app/helpers/cms_edit_helper.rb +32 -24
- data/app/helpers/cms_helper.rb +64 -26
- data/app/helpers/cms_index_helper.rb +84 -72
- data/app/helpers/dc_application_helper.rb +33 -24
- data/app/models/concerns/dc_page_concern.rb +11 -2
- 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 +57 -18
- data/app/models/dc_design.rb +29 -19
- 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 +1 -1
- data/app/models/dc_user_role.rb +2 -2
- data/app/models/drgcms_form_fields/embedded.rb +5 -8
- 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/select.rb +10 -9
- data/app/models/drgcms_form_fields/text_autocomplete.rb +2 -2
- data/app/views/cmsedit/edit.html.erb +2 -0
- data/app/views/cmsedit/index.html.erb +2 -1
- data/app/views/cmsedit/new.html.erb +2 -0
- data/app/views/dc_common/_help.html.erb +8 -0
- data/app/views/layouts/models.html.erb +2 -1
- data/config/locales/drgcms_en.yml +12 -0
- data/config/locales/drgcms_sl.yml +15 -0
- data/config/locales/models_en.yml +5 -5
- data/config/locales/models_sl.yml +7 -6
- data/lib/drg_cms.rb +58 -0
- data/lib/drg_cms/version.rb +1 -1
- metadata +5 -3
- 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
|
#
|
@@ -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
|
@@ -165,15 +169,7 @@ 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
|
#
|
@@ -185,45 +181,75 @@ end
|
|
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
|
-
add_permissions_for # default permission
|
192
|
-
table_name = ''
|
193
|
-
# permission can be set for table or object embedded in table. Read all possible values
|
194
|
-
table.strip.downcase.split(';').each do |t|
|
195
|
-
table_name << (table_name.size > 0 ? ';' : '') + t # table;embedded;another;...
|
196
|
-
add_permissions_for table_name
|
197
|
-
end
|
198
|
-
end
|
199
|
-
# Return true if any of the permissions user has is higher or equal to requested permission
|
200
|
-
session[:user_roles].each {|r| return true if @permissions[r] and @permissions[r] >= permission }
|
184
|
+
def dc_user_can(permission, table = params[:table])
|
185
|
+
permissions = DcPermission.permissions_for_table(table)
|
186
|
+
session[:user_roles].each {|r| return true if permissions[r] && permissions[r] >= permission }
|
201
187
|
false
|
202
|
-
end
|
188
|
+
end
|
203
189
|
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
#
|
213
|
-
# @Example True when user has view permission on the table
|
214
|
-
# if dc_user_can(DcPermission::CAN_VIEW, params[:table]) then ...
|
215
|
-
############################################################################
|
216
|
-
def dc_user_can(permission, table=params[:table])
|
217
|
-
@permissions ||= DcPermission.permissions_for_table(table)
|
218
|
-
# Return true if any of the permissions user has is higher or equal to requested permission
|
219
|
-
session[:user_roles].each {|r| return true if @permissions[r] and @permissions[r] >= permission }
|
190
|
+
def dc_user_can(permission, table = params[:table])
|
191
|
+
cache_key = ['dc_permission', table, session[:user_id], dc_get_site.id]
|
192
|
+
permissions = dc_cache_read(cache_key)
|
193
|
+
if permissions.nil?
|
194
|
+
permissions = DcPermission.permissions_for_table(table)
|
195
|
+
dc_cache_write(cache_key, permissions)
|
196
|
+
end
|
197
|
+
session[:user_roles].each {|r| return true if permissions[r] && permissions[r] >= permission }
|
220
198
|
false
|
221
199
|
end
|
222
200
|
|
223
201
|
####################################################################
|
224
|
-
#
|
202
|
+
# Read from cache
|
203
|
+
#
|
204
|
+
# @keys [Array] Array of keys
|
205
|
+
#
|
206
|
+
# @return [Object] Data returned from cache
|
207
|
+
####################################################################
|
208
|
+
def dc_cache_read(keys)
|
209
|
+
if redis_cache_store?
|
210
|
+
keys = keys.dup
|
211
|
+
first = keys.shift
|
212
|
+
data = redis.hget(first, keys.join(''))
|
213
|
+
data ? Marshal.load(data) : nil
|
214
|
+
else
|
215
|
+
Rails.cache.read(keys.join(''))
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
def __dc_cache_read(keys)
|
220
|
+
p 'read', keys.join(''), Rails.cache.instance_variable_get(:@data).keys
|
221
|
+
pp Rails.cache.read(keys.join(''))
|
222
|
+
end
|
223
|
+
|
224
|
+
####################################################################
|
225
|
+
# Write data to cache
|
226
|
+
#
|
227
|
+
# @param [Array] Array of keys
|
228
|
+
# @param [Object] Data written to cache
|
229
|
+
#
|
230
|
+
# @return [Object] data so dc_cache_write can be used as last statement in method.
|
231
|
+
####################################################################
|
232
|
+
def dc_cache_write(keys, data)
|
233
|
+
if redis_cache_store?
|
234
|
+
keys = keys.dup
|
235
|
+
first = keys.shift
|
236
|
+
redis.hset(first, keys.join(''), Marshal.dump(data))
|
237
|
+
else
|
238
|
+
Rails.cache.write(keys.join(''), data)
|
239
|
+
end
|
240
|
+
data
|
241
|
+
end
|
242
|
+
|
243
|
+
def __dc_cache_write(keys, data)
|
244
|
+
p 'write', keys.join('')
|
245
|
+
pp Rails.cache.write(keys.join(''), data)
|
246
|
+
data
|
247
|
+
end
|
248
|
+
|
249
|
+
####################################################################
|
250
|
+
# Detects if called from mobile agent according to http://detectmobilebrowsers.com/
|
225
251
|
# and set session[:is_mobile]
|
226
|
-
#
|
252
|
+
#
|
227
253
|
# Detect also if caller is a robot and set session[:is_robot]
|
228
254
|
####################################################################
|
229
255
|
def dc_set_is_mobile
|
@@ -231,7 +257,7 @@ def dc_set_is_mobile
|
|
231
257
|
: false
|
232
258
|
session[:is_mobile] = is_mobile ? 1 : 0
|
233
259
|
#
|
234
|
-
if request.env["HTTP_USER_AGENT"] and request.env["HTTP_USER_AGENT"].match(/\(.*https?:\/\/.*\)/)
|
260
|
+
if request.env["HTTP_USER_AGENT "] and request.env["HTTP_USER_AGENT"].match(/\(.*https?:\/\/.*\)/)
|
235
261
|
logger.info "ROBOT: #{Time.now.strftime('%Y.%m.%d %H:%M:%S')} id=#{@page.id} ip=#{request.remote_ip}."
|
236
262
|
session[:is_robot] = true
|
237
263
|
end
|
@@ -299,7 +325,7 @@ def get_design_and_render(design_doc)
|
|
299
325
|
site_top = '<%= dc_page_top %>'
|
300
326
|
site_bottom = '<%= dc_page_bottom %>'
|
301
327
|
# lets try the rails way
|
302
|
-
if @options[:control]
|
328
|
+
if @options[:control] && @options[:action]
|
303
329
|
controller = "#{@options[:control]}_control".classify.constantize rescue nil
|
304
330
|
extend controller if controller
|
305
331
|
return send @options[:action] if respond_to?(@options[:action])
|
@@ -307,7 +333,7 @@ def get_design_and_render(design_doc)
|
|
307
333
|
# design doc present
|
308
334
|
if design_doc
|
309
335
|
# defined as rails view
|
310
|
-
design = if design_doc.rails_view.blank?
|
336
|
+
design = if design_doc.rails_view.blank? || design_doc.rails_view == 'site'
|
311
337
|
@site.rails_view
|
312
338
|
else
|
313
339
|
design_doc.rails_view
|
@@ -319,7 +345,7 @@ def get_design_and_render(design_doc)
|
|
319
345
|
return render(inline: design, layout: layout) unless design.blank?
|
320
346
|
end
|
321
347
|
# Design doc not defined
|
322
|
-
if @site.rails_view.blank?
|
348
|
+
if @site.rails_view.blank?
|
323
349
|
design = site_top + @site.design + site_bottom
|
324
350
|
render(inline: design, layout: layout)
|
325
351
|
else
|
@@ -341,34 +367,34 @@ end
|
|
341
367
|
# dc_process_default_request
|
342
368
|
# end
|
343
369
|
##########################################################################
|
344
|
-
def dc_process_default_request
|
370
|
+
def dc_process_default_request
|
345
371
|
session[:edit_mode] ||= 0
|
346
|
-
# Initialize parts
|
372
|
+
# Initialize parts
|
347
373
|
@parts = nil
|
348
374
|
@js, @css = '', ''
|
349
|
-
# find domain name in sites
|
375
|
+
# find domain name in sites
|
350
376
|
@site = dc_get_site
|
351
|
-
# site not defined. render 404 error
|
377
|
+
# site not defined. render 404 error
|
352
378
|
return dc_render_404('Site!') if @site.nil?
|
379
|
+
|
353
380
|
dc_set_options(@site.settings)
|
354
|
-
# HOMEPAGE. When no parameters is set
|
381
|
+
# HOMEPAGE. When no parameters is set
|
355
382
|
params[:path] = @site.homepage_link if params[:id].nil? and params[:path].nil?
|
356
383
|
@options[:path] = params[:path].to_s.downcase.split('/')
|
357
384
|
params[:path] = @options[:path].first if @options[:path].size > 1
|
358
|
-
# some other process request. It should fail if not defined
|
385
|
+
# some other process request. It should fail if not defined
|
359
386
|
return send(@site.request_processor) unless @site.request_processor.blank?
|
360
|
-
|
361
|
-
# Search for page
|
387
|
+
# Search for page
|
362
388
|
pageclass = @site.page_klass
|
363
389
|
if params[:id]
|
364
390
|
#Page.where(id: params[:id]).or(subject_link: params[:id]).first
|
365
391
|
@page = pageclass.find_by(:dc_site_id.in => [@site._id, nil], subject_link: params[:id], active: true)
|
366
392
|
@page = pageclass.find(params[:id]) if @page.nil? # I think that there will be more subject_link searchers than id
|
367
393
|
elsif params[:path]
|
368
|
-
# path may point direct to page's subject_link
|
394
|
+
# path may point direct to page's subject_link
|
369
395
|
@page = pageclass.find_by(:dc_site_id.in => [@site._id, nil], subject_link: params[:path], active: true)
|
370
396
|
if @page.nil?
|
371
|
-
# no. Find if defined in links
|
397
|
+
# no. Find if defined in links
|
372
398
|
link = DcLink.find_by(:dc_site_id.in => [@site._id, nil], name: params[:path])
|
373
399
|
if link
|
374
400
|
#pageclass.find_by(alt_link: params[:path])
|
@@ -377,10 +403,10 @@ def dc_process_default_request()
|
|
377
403
|
end
|
378
404
|
end
|
379
405
|
end
|
380
|
-
# if @page is not found render 404 error
|
406
|
+
# if @page is not found render 404 error
|
381
407
|
return dc_render_404('Page!') unless @page
|
382
408
|
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
|
409
|
+
# find design if defined. Otherwise design MUST be declared in site
|
384
410
|
if @page.dc_design_id
|
385
411
|
@design = DcDesign.find(@page.dc_design_id)
|
386
412
|
return dc_render_404('Design!') unless @design
|
@@ -388,20 +414,21 @@ def dc_process_default_request()
|
|
388
414
|
dc_set_options @design.params if @design
|
389
415
|
dc_set_options @page.params
|
390
416
|
dc_add_json_ld(@page.get_json_ld)
|
391
|
-
# Add edit menu
|
417
|
+
# Add edit menu
|
392
418
|
if session[:edit_mode] > 0
|
393
419
|
session[:site_id] = @site.id
|
394
420
|
session[:site_page_class] = @site.page_class
|
395
421
|
session[:page_id] = @page.id
|
396
|
-
else
|
397
|
-
# Log only visits from non-editors
|
422
|
+
else
|
423
|
+
# Log only visits from non-editors
|
398
424
|
dc_log_visit()
|
399
425
|
end
|
400
426
|
set_page_title()
|
401
427
|
get_design_and_render @design
|
402
428
|
end
|
403
429
|
|
404
|
-
|
430
|
+
######
|
431
|
+
# ####################################################################
|
405
432
|
# Single site document kind of request handler.
|
406
433
|
#
|
407
434
|
# This request handler assumes that all data for the site is saved in the site document.
|
@@ -501,7 +528,7 @@ end
|
|
501
528
|
#
|
502
529
|
####################################################################
|
503
530
|
def dc_check_model(document, crash=false)
|
504
|
-
|
531
|
+
DrgCms.check_model(document, crash=false)
|
505
532
|
end
|
506
533
|
|
507
534
|
######################################################################
|
@@ -525,7 +552,7 @@ end
|
|
525
552
|
# can be found in drg_cms.js file.
|
526
553
|
#
|
527
554
|
# @param [Hash] Options
|
528
|
-
#
|
555
|
+
#
|
529
556
|
# @return [JSON Response] Formatted to be used for ajax return.
|
530
557
|
#
|
531
558
|
# @example
|
@@ -537,7 +564,7 @@ end
|
|
537
564
|
######################################################################
|
538
565
|
def dc_render_ajax(opts)
|
539
566
|
result = {}
|
540
|
-
if opts[:div]
|
567
|
+
if opts[:div] || opts[:class]
|
541
568
|
selector = opts[:div] ? '#' : '.' # for div . for class
|
542
569
|
key = case
|
543
570
|
when opts[:prepend] then "#{selector}+div"
|
@@ -559,7 +586,7 @@ end
|
|
559
586
|
# @param [String] Table (collection) name. Could be dc_page;dc_part;... when searching for embedded document.
|
560
587
|
# @param [String] Id of the document
|
561
588
|
# @param [String] Ids of parent documents when document is embedded. Ids are separated by ; char.
|
562
|
-
#
|
589
|
+
#
|
563
590
|
# @return [document]. Required document or nil if not found.
|
564
591
|
#
|
565
592
|
# @example As used in Cmsedit_controller
|
@@ -604,7 +631,7 @@ def clear_login_data
|
|
604
631
|
session[:edit_mode] = 0
|
605
632
|
session[:user_id] = nil
|
606
633
|
session[:user_name] = nil
|
607
|
-
|
634
|
+
set_default_guest_user_role
|
608
635
|
cookies.delete :remember_me
|
609
636
|
end
|
610
637
|
|
@@ -618,20 +645,20 @@ end
|
|
618
645
|
|
619
646
|
####################################################################
|
620
647
|
# Fills session with data related to successful login.
|
621
|
-
#
|
648
|
+
#
|
622
649
|
# @param [DcUser] user : User's document
|
623
650
|
# @param [Boolean] remember_me : false by default
|
624
651
|
####################################################################
|
625
652
|
def fill_login_data(user, remember_me=false)
|
626
653
|
session[:user_id] = user.id if user
|
627
654
|
session[:user_name] = user.name if user
|
628
|
-
session[:edit_mode] = 0
|
655
|
+
session[:edit_mode] = 0
|
629
656
|
session[:user_roles] = []
|
630
657
|
# Every user has guest role
|
631
|
-
# guest = DcPolicyRole.find_by(system_name: 'guest')
|
632
|
-
# session[:user_roles] << guest.id if guest
|
658
|
+
# guest = DcPolicyRole.find_by(system_name: 'guest')
|
659
|
+
# session[:user_roles] << guest.id if guest
|
633
660
|
set_default_guest_user_role
|
634
|
-
return unless user and user.active
|
661
|
+
return unless user and user.active
|
635
662
|
# special for SUPERADMIN
|
636
663
|
sa = DcPolicyRole.find_by(system_name: 'superadmin')
|
637
664
|
if sa and (role = user.dc_user_roles.find_by(dc_policy_role_id: sa.id))
|
@@ -643,7 +670,7 @@ def fill_login_data(user, remember_me=false)
|
|
643
670
|
policy_site = dc_get_site()
|
644
671
|
policy_site = DcSite.find(policy_site.inherit_policy) if policy_site.inherit_policy
|
645
672
|
default_policy = policy_site.dc_policies.find_by(is_default: true)
|
646
|
-
# load user roles
|
673
|
+
# load user roles
|
647
674
|
user.dc_user_roles.each do |role|
|
648
675
|
next unless role.active
|
649
676
|
next if role.valid_from and role.valid_from > Time.now.end_of_day.to_date
|
@@ -651,7 +678,7 @@ def fill_login_data(user, remember_me=false)
|
|
651
678
|
# check if role is active in this site
|
652
679
|
policy_role = default_policy.dc_policy_rules.find_by(dc_policy_role_id: role.dc_policy_role_id)
|
653
680
|
next unless policy_role
|
654
|
-
# set edit_mode
|
681
|
+
# set edit_mode
|
655
682
|
session[:edit_mode] = 1 if policy_role.permission > 1
|
656
683
|
session[:user_roles] << role.dc_policy_role_id
|
657
684
|
end
|
@@ -661,15 +688,75 @@ def fill_login_data(user, remember_me=false)
|
|
661
688
|
end
|
662
689
|
end
|
663
690
|
|
691
|
+
####################################################################
|
692
|
+
# Fills session with data related to successful login.
|
693
|
+
#
|
694
|
+
# @param [DcUser] user : User's document
|
695
|
+
# @param [Boolean] remember_me : false by default
|
696
|
+
####################################################################
|
697
|
+
def fill_login_data(user, remember_me = false)
|
698
|
+
session[:user_id] = user.id if user
|
699
|
+
session[:user_name] = user.name if user
|
700
|
+
session[:edit_mode] = 0
|
701
|
+
set_default_guest_user_role
|
702
|
+
return unless user&.active
|
703
|
+
|
704
|
+
# special for SUPERADMIN
|
705
|
+
sa = DcPolicyRole.find_by(system_name: 'superadmin')
|
706
|
+
if sa && (role = user.dc_user_roles.find_by(dc_policy_role_id: sa.id))
|
707
|
+
session[:user_roles] << role.dc_policy_role_id
|
708
|
+
session[:edit_mode] = 2
|
709
|
+
return
|
710
|
+
end
|
711
|
+
# read default policy from site. Policy might be inherited from other site
|
712
|
+
policy_site = dc_get_site()
|
713
|
+
policy_site = DcSite.find(policy_site.inherit_policy) if policy_site.inherit_policy
|
714
|
+
default_policy = policy_site.dc_policies.find_by(is_default: true)
|
715
|
+
|
716
|
+
# load user roles from groups
|
717
|
+
roles = {}
|
718
|
+
user.member.each do |group_id|
|
719
|
+
group = DcUser.find(group_id)
|
720
|
+
next unless group.active
|
721
|
+
|
722
|
+
group.dc_user_roles.each do |role|
|
723
|
+
next unless role.active?
|
724
|
+
roles[role.dc_policy_role_id] = role
|
725
|
+
end
|
726
|
+
end unless user.member.blank?
|
727
|
+
|
728
|
+
# load user roles from user
|
729
|
+
user.dc_user_roles.each do |role|
|
730
|
+
# not active in user roles will remove role defined in groups
|
731
|
+
unless role.active?
|
732
|
+
roles.delete(role.dc_policy_role_id) if roles[role.dc_policy_role_id]
|
733
|
+
next
|
734
|
+
end
|
735
|
+
roles[role.dc_policy_role_id] = role
|
736
|
+
end
|
737
|
+
# select only roles defined in default site policy and set edit_mode
|
738
|
+
roles.each do |key, role|
|
739
|
+
# check if role is active in this site
|
740
|
+
policy_role = default_policy.dc_policy_rules.find_by(dc_policy_role_id: role.dc_policy_role_id)
|
741
|
+
next unless policy_role
|
742
|
+
# set edit_mode
|
743
|
+
session[:edit_mode] = 1 if policy_role.permission > 1
|
744
|
+
session[:user_roles] << role.dc_policy_role_id
|
745
|
+
end
|
746
|
+
# Save remember me cookie if not CMS user and remember me is selected
|
747
|
+
if session[:edit_mode] == 0 && remember_me
|
748
|
+
cookies.signed[:remember_me] = { value: user.id, expires: 180.days.from_now }
|
749
|
+
end
|
750
|
+
end
|
751
|
+
|
664
752
|
##########################################################################
|
665
|
-
# Will check if user's login data is
|
753
|
+
# Will check if user's login data is still valid and reload user roles.
|
666
754
|
#
|
667
755
|
# @param [Time] repeat_after : Check is repeated after time. This is by default performed every 24 hours.
|
668
756
|
##########################################################################
|
669
|
-
def dc_check_user_still_valid(repeat_after=1.day)
|
670
|
-
|
671
|
-
|
672
|
-
# last check more than a day ago
|
757
|
+
def dc_check_user_still_valid(repeat_after = 1.day)
|
758
|
+
return if session[:user_id].nil?
|
759
|
+
# last check more than repeat_after ago
|
673
760
|
if (session[:user_chk] ||= Time.now) < repeat_after.ago
|
674
761
|
user_id = session[:user_id]
|
675
762
|
clear_login_data
|
@@ -686,7 +773,7 @@ end
|
|
686
773
|
# @param [String] class_method defined as MyClass.method_name
|
687
774
|
# @param [Object] optional parameters send to class_method
|
688
775
|
##########################################################################
|
689
|
-
def dc_eval_class_method(class_method, params=nil)
|
776
|
+
def dc_eval_class_method(class_method, params = nil)
|
690
777
|
klass, method = class_method.split('.')
|
691
778
|
# check if class exists
|
692
779
|
klass = klass.classify.constantize rescue nil
|
@@ -729,6 +816,7 @@ end
|
|
729
816
|
########################################################################
|
730
817
|
def dc_add_meta_tag(type, name, content)
|
731
818
|
return if content.blank?
|
819
|
+
|
732
820
|
@meta_tags ||= {}
|
733
821
|
key = "#{type}=\"#{name}\""
|
734
822
|
@meta_tags[key] = content
|
@@ -745,11 +833,38 @@ end
|
|
745
833
|
#
|
746
834
|
########################################################################
|
747
835
|
def dc_update_form_field(field_name, value, readonly=false)
|
836
|
+
dc_deprecate('dc_update_form_field will be deprecated. Use dc_update_form_element instead.')
|
748
837
|
key_name = (readonly ? 'td_' : '') + "record_#{field_name}"
|
749
838
|
flash[:update] ||= {}
|
750
839
|
flash[:update][key_name] = value
|
751
840
|
end
|
752
841
|
|
842
|
+
########################################################################
|
843
|
+
# Will prepare flash[:update] data, which will be used for updating elements
|
844
|
+
# on parent form.
|
845
|
+
#
|
846
|
+
# dc_update_form_field will be deprecated eventually.
|
847
|
+
#
|
848
|
+
# Parameters passed as hash:
|
849
|
+
# [field] String: Field name
|
850
|
+
# [head] String: Filed name in head of form
|
851
|
+
# [value] String: New value
|
852
|
+
# [readonly] Boolean: Field is readonly
|
853
|
+
#
|
854
|
+
########################################################################
|
855
|
+
def dc_update_form_element(field: nil, head: nil, value:, readonly: true)
|
856
|
+
key = if field
|
857
|
+
(readonly ? 'td_' : '') + "record_#{field}"
|
858
|
+
elsif head
|
859
|
+
"head-#{head}"
|
860
|
+
end
|
861
|
+
|
862
|
+
if key
|
863
|
+
flash[:update] ||= {}
|
864
|
+
flash[:update][key] = value
|
865
|
+
end
|
866
|
+
end
|
867
|
+
|
753
868
|
####################################################################
|
754
869
|
# Checks if any errors exist on document and writes error log. It can also
|
755
870
|
# crash if requested. This is mostly usefull in development for debuging
|
@@ -769,20 +884,8 @@ end
|
|
769
884
|
# end
|
770
885
|
#
|
771
886
|
####################################################################
|
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
|
887
|
+
def self.dc_check_model(document, crash = false)
|
888
|
+
DrgCms.model_check(document, crash)
|
786
889
|
end
|
787
890
|
|
788
891
|
########################################################################
|
@@ -798,5 +901,24 @@ def dc_dump_exception(exception)
|
|
798
901
|
Rails.logger.error msg
|
799
902
|
end
|
800
903
|
|
904
|
+
private
|
905
|
+
|
906
|
+
########################################################################
|
907
|
+
# Determines if redis cache store is active
|
908
|
+
#
|
909
|
+
# @return [Boolean] : True if redis cache store is active
|
910
|
+
########################################################################
|
911
|
+
def redis_cache_store?
|
912
|
+
(Rails.application.config.cache_store.first == :redis_cache_store) rescue false
|
913
|
+
end
|
914
|
+
|
915
|
+
########################################################################
|
916
|
+
# Returns redis object
|
917
|
+
#
|
918
|
+
# @return [Object] : Redis object
|
919
|
+
########################################################################
|
920
|
+
def redis
|
921
|
+
Rails.cache.redis
|
922
|
+
end
|
801
923
|
|
802
924
|
end
|