drg_cms 0.5.52.12 → 0.6.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/app/assets/javascripts/drg_cms/drg_cms.js +395 -120
- data/app/assets/javascripts/drg_cms/jstree.min.js +6 -6
- data/app/assets/javascripts/drg_cms_application.js +1 -1
- data/app/assets/stylesheets/drg_cms/drg_cms.css +476 -215
- data/app/assets/stylesheets/drg_cms/jstree.css +6 -12
- data/app/assets/stylesheets/drg_cms/select-multiple.css +19 -13
- data/app/assets/stylesheets/drg_cms_cms.css +1 -1
- data/app/controllers/cmsedit_controller.rb +474 -233
- data/app/controllers/dc_application_controller.rb +264 -41
- data/app/controllers/dc_common_controller.rb +75 -63
- data/app/{controllers → controls}/browse_models_control.rb +0 -0
- data/app/{controllers → controls}/dc_page_control.rb +24 -8
- data/app/controls/dc_poll_result_control.rb +88 -0
- data/app/controls/dc_report.rb +227 -0
- data/app/{controllers → controls}/design_element_settings_control.rb +0 -0
- data/app/forms/all_options.yml +70 -12
- data/app/forms/cms_menu.yml +26 -17
- data/app/forms/dc_ad.yml +11 -22
- data/app/forms/dc_big_table.yml +1 -0
- data/app/forms/dc_big_table_value.yml +1 -0
- data/app/forms/dc_design.yml +19 -16
- data/app/forms/dc_filter.yml +3 -6
- data/app/forms/dc_gallery.yml +53 -0
- data/app/forms/dc_json_ld.yml +59 -0
- data/app/forms/dc_key_value.yml +32 -0
- data/app/forms/dc_link.yml +16 -10
- data/app/forms/dc_menu_item.yml +6 -0
- data/app/forms/dc_page.yml +2 -7
- data/app/forms/dc_poll.yml +16 -9
- data/app/forms/dc_poll_item.yml +2 -1
- data/app/forms/dc_poll_result.yml +83 -0
- data/app/forms/dc_poll_result_export.yml +35 -0
- data/app/forms/dc_removed_url.yml +42 -0
- data/app/forms/dc_seo.yml +33 -0
- data/app/forms/dc_site.yml +2 -6
- data/app/forms/json_ld_schema.yml +168 -0
- data/app/helpers/cms_common_helper.rb +311 -0
- data/app/helpers/cms_edit_helper.rb +498 -0
- data/app/helpers/cms_helper.rb +230 -0
- data/app/helpers/cms_index_helper.rb +564 -0
- data/app/helpers/dc_application_helper.rb +195 -268
- data/app/models/{dc_dummy.rb → __dc_dummy.rb} +0 -0
- data/app/models/concerns/dc_page_concern.rb +31 -6
- data/app/models/concerns/dc_seo_concern.rb +66 -0
- data/app/models/concerns/dc_site_concern.rb +12 -1
- data/app/models/concerns/dc_user_concern.rb +5 -3
- data/app/models/dc_design.rb +2 -0
- data/app/models/dc_filter.rb +37 -20
- data/app/models/dc_gallery.rb +64 -0
- data/app/models/dc_json_ld.rb +152 -0
- data/app/models/dc_key_value.rb +48 -0
- data/app/models/dc_link.rb +1 -0
- data/app/models/dc_memory.rb +26 -4
- data/app/models/dc_page.rb +1 -2
- data/app/models/dc_permission.rb +30 -0
- data/app/models/dc_poll.rb +39 -19
- data/app/models/dc_poll_result.rb +46 -0
- data/app/models/dc_removed_url.rb +54 -0
- data/app/models/dc_temp.rb +140 -0
- data/app/models/drgcms_form_fields.rb +6 -1642
- data/app/models/drgcms_form_fields/action.rb +61 -0
- data/app/models/drgcms_form_fields/check_box.rb +72 -0
- data/app/models/drgcms_form_fields/comment.rb +53 -0
- data/app/models/drgcms_form_fields/date_picker.rb +104 -0
- data/app/models/drgcms_form_fields/date_select.rb +68 -0
- data/app/models/drgcms_form_fields/datetime_picker.rb +89 -0
- data/app/models/drgcms_form_fields/datetime_select.rb +73 -0
- data/app/models/drgcms_form_fields/drgcms_field.rb +287 -0
- data/app/models/drgcms_form_fields/embedded.rb +97 -0
- data/app/models/drgcms_form_fields/file_field.rb +52 -0
- data/app/models/drgcms_form_fields/file_select.rb +70 -0
- data/app/models/drgcms_form_fields/hash_field.rb +86 -0
- data/app/models/drgcms_form_fields/hidden_field.rb +52 -0
- data/app/models/drgcms_form_fields/html_field.rb +70 -0
- data/app/models/drgcms_form_fields/journal_diff.rb +60 -0
- data/app/models/drgcms_form_fields/link_to.rb +69 -0
- data/app/models/drgcms_form_fields/method.rb +65 -0
- data/app/models/drgcms_form_fields/multitext_autocomplete.rb +204 -0
- data/app/models/drgcms_form_fields/number_field.rb +92 -0
- data/app/models/drgcms_form_fields/password_field.rb +62 -0
- data/app/models/drgcms_form_fields/radio.rb +96 -0
- data/app/models/drgcms_form_fields/readonly.rb +79 -0
- data/app/models/drgcms_form_fields/select.rb +226 -0
- data/app/models/drgcms_form_fields/submit_tag.rb +58 -0
- data/app/models/drgcms_form_fields/text_area.rb +68 -0
- data/app/models/drgcms_form_fields/text_autocomplete.rb +155 -0
- data/app/models/drgcms_form_fields/text_field.rb +56 -0
- data/app/models/drgcms_form_fields/text_with_select.rb +95 -0
- data/app/models/drgcms_form_fields/tree_select.rb +169 -0
- data/app/{helpers → renderers}/dc_ad_renderer.rb +0 -0
- data/app/{helpers → renderers}/dc_big_menu_renderer.rb +1 -0
- data/app/{helpers → renderers}/dc_captcha_renderer.rb +0 -0
- data/app/{helpers → renderers}/dc_common_renderer.rb +0 -0
- data/app/renderers/dc_gallery_renderer.rb +95 -0
- data/app/{helpers → renderers}/dc_menu_renderer.rb +11 -4
- data/app/{helpers → renderers}/dc_page_renderer.rb +21 -3
- data/app/{helpers → renderers}/dc_part_renderer.rb +5 -4
- data/app/{helpers → renderers}/dc_piece_renderer.rb +1 -1
- data/app/{helpers → renderers}/dc_poll_renderer.rb +86 -51
- data/app/{helpers → renderers}/dc_renderer.rb +1 -0
- data/app/{helpers → renderers}/dc_simple_menu_renderer.rb +1 -0
- data/app/views/cmsedit/{remove_edit_stuff.js.erb → __remove_edit_stuff.js.erb} +0 -0
- data/app/views/cmsedit/{show.html.erb → __show.html.erb} +0 -0
- data/app/views/cmsedit/_edit_stuff.html.erb +4 -25
- data/app/views/cmsedit/_form.html.erb +4 -3
- data/app/views/cmsedit/_result.html.erb +2 -3
- data/app/views/cmsedit/edit.html.erb +2 -1
- data/app/views/cmsedit/index.html.erb +6 -1
- data/app/views/cmsedit/new.html.erb +1 -1
- data/config/locales/drgcms_en.yml +15 -3
- data/config/locales/drgcms_sl.yml +18 -6
- data/config/locales/models_en.yml +103 -19
- data/config/locales/models_sl.yml +102 -17
- data/drg_cms.gemspec +3 -3
- data/lib/drg_cms.rb +6 -2
- data/lib/drg_cms/version.rb +2 -2
- data/lib/generators/new_drg_form/new_drg_form_generator.rb +9 -2
- data/lib/tasks/database.rake +6 -56
- data/lib/tasks/dc_cleanup.rake +1 -1
- metadata +106 -61
- data/app/assets/stylesheets/drg_cms/__jquery-ui.css +0 -339
- data/app/helpers/application_helper.rb +0 -2
- data/app/helpers/cmsedit_helper.rb +0 -844
- data/test/fixtures/drg_cms_test_data.rb +0 -87
@@ -65,11 +65,7 @@ end
|
|
65
65
|
# if dc_user_has_role('Site editors') ...
|
66
66
|
####################################################################
|
67
67
|
def dc_user_has_role(role)
|
68
|
-
|
69
|
-
rol = role
|
70
|
-
role = DcPolicyRole.find_by(name: rol)
|
71
|
-
role = DcPolicyRole.find_by(system_name: rol) if role.nil?
|
72
|
-
end
|
68
|
+
role = DcPolicyRole.get_role(role)
|
73
69
|
return false if role.nil? or session[:user_roles].nil?
|
74
70
|
# role is found in user_roles
|
75
71
|
session[:user_roles].include?(role._id)
|
@@ -109,7 +105,8 @@ end
|
|
109
105
|
# Sets internal @page_title variable.
|
110
106
|
##########################################################################
|
111
107
|
def set_page_title()
|
112
|
-
@page_title = @page.title.blank? ?
|
108
|
+
@page_title = @page.title.blank? ? @page.subject : @page.title
|
109
|
+
dc_add_meta_tag(:name, 'description', @page.meta_description)
|
113
110
|
end
|
114
111
|
|
115
112
|
########################################################################
|
@@ -131,8 +128,7 @@ def dc_find_form_file(form_file)
|
|
131
128
|
f = "#{path}/#{form_file}.yml"
|
132
129
|
return f if File.exist?(f) and (form_path.nil? or path.to_s.match(/\/#{form_path}\//i))
|
133
130
|
end
|
134
|
-
|
135
|
-
nil
|
131
|
+
raise "Exception: Form file '#{form_file}' not found!"
|
136
132
|
end
|
137
133
|
|
138
134
|
#######################################################################
|
@@ -145,8 +141,8 @@ end
|
|
145
141
|
# return dc_render_404('Site') unless site
|
146
142
|
########################################################################
|
147
143
|
def dc_render_404(where_the_error_is=nil)
|
148
|
-
logger.info("Error 404
|
149
|
-
render(file:
|
144
|
+
logger.info("Error 404;#{request.env['REQUEST_URI'] rescue ''};#{request.referer};#{where_the_error_is}")
|
145
|
+
render(file: Rails.root.join('public/404.html'), status: 404)
|
150
146
|
end
|
151
147
|
|
152
148
|
########################################################################
|
@@ -172,7 +168,7 @@ protected
|
|
172
168
|
#############################################################################
|
173
169
|
# Add permissions. Subroutine of dc_user_can
|
174
170
|
############################################################################
|
175
|
-
def
|
171
|
+
def __add_permissions_for(table_name=nil) # :nodoc:
|
176
172
|
perm = table_name.nil? ? DcPermission.find_by(is_default: true) : DcPermission.find_by(table_name: table_name, active: true)
|
177
173
|
(perm.dc_policy_rules.each {|p1| @permissions[p1.dc_policy_role_id] = p1.permission }) if perm
|
178
174
|
end
|
@@ -189,7 +185,7 @@ end
|
|
189
185
|
# @Example True when user has view permission on the table
|
190
186
|
# if dc_user_can(DcPermission::CAN_VIEW, params[:table]) then ...
|
191
187
|
############################################################################
|
192
|
-
def
|
188
|
+
def __dc_user_can(permission, table=params[:table])
|
193
189
|
if @permissions.nil?
|
194
190
|
@permissions = {}
|
195
191
|
add_permissions_for # default permission
|
@@ -205,16 +201,42 @@ def dc_user_can(permission, table=params[:table])
|
|
205
201
|
false
|
206
202
|
end
|
207
203
|
|
204
|
+
###########################################################################
|
205
|
+
# Checks if user can perform (read, create, edit, delete) document in specified
|
206
|
+
# table (collection).
|
207
|
+
#
|
208
|
+
# @param [Integer] Required permission level
|
209
|
+
# @param [String] Collection (table) name for which permission is queried. Defaults to params[table].
|
210
|
+
#
|
211
|
+
# @return [Boolean] true if user's role permits (is higher or equal then required) operation on a table (collection).
|
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 }
|
220
|
+
false
|
221
|
+
end
|
222
|
+
|
208
223
|
####################################################################
|
209
|
-
# Detects if called from mobile agent according to http://detectmobilebrowsers.com/
|
224
|
+
# Detects if called from mobile agent according to http://detectmobilebrowsers.com/
|
225
|
+
# and set session[:is_mobile]
|
226
|
+
#
|
227
|
+
# Detect also if caller is a robot and set session[:is_robot]
|
210
228
|
####################################################################
|
211
229
|
def dc_set_is_mobile
|
212
230
|
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])
|
213
231
|
: false
|
214
232
|
session[:is_mobile] = is_mobile ? 1 : 0
|
233
|
+
#
|
234
|
+
if request.env["HTTP_USER_AGENT"] and request.env["HTTP_USER_AGENT"].match(/\(.*https?:\/\/.*\)/)
|
235
|
+
logger.info "ROBOT: #{Time.now.strftime('%Y.%m.%d %H:%M:%S')} id=#{@page.id} ip=#{request.remote_ip}."
|
236
|
+
session[:is_robot] = true
|
237
|
+
end
|
215
238
|
end
|
216
239
|
|
217
|
-
|
218
240
|
##########################################################################
|
219
241
|
# Merge values from parameters fields (from site, page ...) into internal @options hash.
|
220
242
|
#
|
@@ -282,23 +304,27 @@ def get_design_and_render(design_doc)
|
|
282
304
|
extend controller if controller
|
283
305
|
return send @options[:action] if respond_to?(@options[:action])
|
284
306
|
end
|
285
|
-
#
|
307
|
+
# design doc present
|
286
308
|
if design_doc
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
design = site_top + design_doc.body + site_bottom
|
293
|
-
return render(inline: design, layout: layout)
|
309
|
+
# defined as rails view
|
310
|
+
design = if design_doc.rails_view.blank? or design_doc.rails_view == 'site'
|
311
|
+
@site.rails_view
|
312
|
+
else
|
313
|
+
design_doc.rails_view
|
294
314
|
end
|
315
|
+
return render design, layout: layout unless design.blank?
|
316
|
+
# defined as inline code
|
317
|
+
design = design_doc.body.blank? ? @site.design : design_doc.body
|
318
|
+
design = site_top + design + site_bottom
|
319
|
+
return render(inline: design, layout: layout) unless design.blank?
|
295
320
|
end
|
296
|
-
#
|
321
|
+
# Design doc not defined
|
297
322
|
if @site.rails_view.blank?
|
298
323
|
design = site_top + @site.design + site_bottom
|
299
|
-
|
300
|
-
|
301
|
-
|
324
|
+
render(inline: design, layout: layout)
|
325
|
+
else
|
326
|
+
render @site.rails_view, layout: layout
|
327
|
+
end
|
302
328
|
end
|
303
329
|
|
304
330
|
##########################################################################
|
@@ -327,13 +353,13 @@ def dc_process_default_request()
|
|
327
353
|
dc_set_options(@site.settings)
|
328
354
|
# HOMEPAGE. When no parameters is set
|
329
355
|
params[:path] = @site.homepage_link if params[:id].nil? and params[:path].nil?
|
330
|
-
@options[:path] = params[:path].to_s.split('/')
|
356
|
+
@options[:path] = params[:path].to_s.downcase.split('/')
|
331
357
|
params[:path] = @options[:path].first if @options[:path].size > 1
|
332
358
|
# some other process request. It should fail if not defined
|
333
359
|
return send(@site.request_processor) unless @site.request_processor.blank?
|
334
360
|
|
335
361
|
# Search for page
|
336
|
-
pageclass = @site.
|
362
|
+
pageclass = @site.page_klass
|
337
363
|
if params[:id]
|
338
364
|
#Page.where(id: params[:id]).or(subject_link: params[:id]).first
|
339
365
|
@page = pageclass.find_by(:dc_site_id.in => [@site._id, nil], subject_link: params[:id], active: true)
|
@@ -353,17 +379,19 @@ def dc_process_default_request()
|
|
353
379
|
end
|
354
380
|
# if @page is not found render 404 error
|
355
381
|
return dc_render_404('Page!') unless @page
|
356
|
-
dc_set_options @page.params
|
357
382
|
dc_set_is_mobile unless session[:is_mobile] # do it only once per session
|
358
383
|
# find design if defined. Otherwise design MUST be declared in site
|
359
384
|
if @page.dc_design_id
|
360
385
|
@design = DcDesign.find(@page.dc_design_id)
|
361
386
|
return dc_render_404('Design!') unless @design
|
362
387
|
end
|
388
|
+
dc_set_options @design.params if @design
|
389
|
+
dc_set_options @page.params
|
390
|
+
dc_add_json_ld(@page.get_json_ld)
|
363
391
|
# Add edit menu
|
364
392
|
if session[:edit_mode] > 0
|
365
393
|
session[:site_id] = @site.id
|
366
|
-
session[:
|
394
|
+
session[:site_page_class] = @site.page_class
|
367
395
|
session[:page_id] = @page.id
|
368
396
|
else
|
369
397
|
# Log only visits from non-editors
|
@@ -454,7 +482,7 @@ eot
|
|
454
482
|
end
|
455
483
|
|
456
484
|
####################################################################
|
457
|
-
# Checks if any errors exist on document and writes
|
485
|
+
# Checks if any errors exist on document and writes error log. It can also
|
458
486
|
# crash if requested. This is mostly usefull in development for debuging
|
459
487
|
# model errors or when saving to multiple collections and where each save must be
|
460
488
|
# checked if succesfull.
|
@@ -473,14 +501,7 @@ end
|
|
473
501
|
#
|
474
502
|
####################################################################
|
475
503
|
def dc_check_model(document, crash=false)
|
476
|
-
|
477
|
-
msg = ''
|
478
|
-
document.errors.each do |attribute, errors_array|
|
479
|
-
msg << "#{attribute}: #{errors_array}\n"
|
480
|
-
end
|
481
|
-
logger.debug(msg) if msg.size > 0
|
482
|
-
crash_it if crash
|
483
|
-
msg
|
504
|
+
DcApplicationController.dc_check_model(document, crash=false)
|
484
505
|
end
|
485
506
|
|
486
507
|
######################################################################
|
@@ -525,11 +546,11 @@ def dc_render_ajax(opts)
|
|
525
546
|
end
|
526
547
|
key << "_#{opts[:div]}#{opts[:class]}"
|
527
548
|
else
|
528
|
-
|
549
|
+
logger.error 'Error: dc_render_ajax. Operation is not set!' if opts[:operation].nil?
|
529
550
|
key = "#{opts[:operation]}_"
|
530
551
|
end
|
531
552
|
result[key] = opts[:value] || opts[:url] || ''
|
532
|
-
render
|
553
|
+
render json: result
|
533
554
|
end
|
534
555
|
|
535
556
|
########################################################################
|
@@ -576,4 +597,206 @@ def dc_deprecate(msg)
|
|
576
597
|
ActiveSupport::Deprecation.warn("#{dc_get_site.name}: #{msg}")
|
577
598
|
end
|
578
599
|
|
600
|
+
####################################################################
|
601
|
+
# Clears all session data related to login.
|
602
|
+
####################################################################
|
603
|
+
def clear_login_data
|
604
|
+
session[:edit_mode] = 0
|
605
|
+
session[:user_id] = nil
|
606
|
+
session[:user_name] = nil
|
607
|
+
session[:user_roles] = nil
|
608
|
+
cookies.delete :remember_me
|
609
|
+
end
|
610
|
+
|
611
|
+
############################################################################
|
612
|
+
# Sets at least default guest user to user roles when no user is set.
|
613
|
+
############################################################################
|
614
|
+
def set_default_guest_user_role
|
615
|
+
guest = DcPolicyRole.find_by(system_name: 'guest')
|
616
|
+
session[:user_roles] = [guest.id] if guest
|
617
|
+
end
|
618
|
+
|
619
|
+
####################################################################
|
620
|
+
# Fills session with data related to successful login.
|
621
|
+
#
|
622
|
+
# @param [DcUser] user : User's document
|
623
|
+
# @param [Boolean] remember_me : false by default
|
624
|
+
####################################################################
|
625
|
+
def fill_login_data(user, remember_me=false)
|
626
|
+
session[:user_id] = user.id if user
|
627
|
+
session[:user_name] = user.name if user
|
628
|
+
session[:edit_mode] = 0
|
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
|
633
|
+
set_default_guest_user_role
|
634
|
+
return unless user and user.active
|
635
|
+
# special for SUPERADMIN
|
636
|
+
sa = DcPolicyRole.find_by(system_name: 'superadmin')
|
637
|
+
if sa and (role = user.dc_user_roles.find_by(dc_policy_role_id: sa.id))
|
638
|
+
session[:user_roles] << role.dc_policy_role_id
|
639
|
+
session[:edit_mode] = 2
|
640
|
+
return
|
641
|
+
end
|
642
|
+
# read default policy from site. Policy might be inherited
|
643
|
+
policy_site = dc_get_site()
|
644
|
+
policy_site = DcSite.find(policy_site.inherit_policy) if policy_site.inherit_policy
|
645
|
+
default_policy = policy_site.dc_policies.find_by(is_default: true)
|
646
|
+
# load user roles
|
647
|
+
user.dc_user_roles.each do |role|
|
648
|
+
next unless role.active
|
649
|
+
next if role.valid_from and role.valid_from > Time.now.end_of_day.to_date
|
650
|
+
next if role.valid_to and role.valid_to < Time.now.to_date
|
651
|
+
# check if role is active in this site
|
652
|
+
policy_role = default_policy.dc_policy_rules.find_by(dc_policy_role_id: role.dc_policy_role_id)
|
653
|
+
next unless policy_role
|
654
|
+
# set edit_mode
|
655
|
+
session[:edit_mode] = 1 if policy_role.permission > 1
|
656
|
+
session[:user_roles] << role.dc_policy_role_id
|
657
|
+
end
|
658
|
+
# Save remember me cookie if not CMS user and remember me is selected
|
659
|
+
if session[:edit_mode] == 0 and remember_me
|
660
|
+
cookies.signed[:remember_me] = { :value => user.id, :expires => 180.days.from_now}
|
661
|
+
end
|
662
|
+
end
|
663
|
+
|
664
|
+
##########################################################################
|
665
|
+
# Will check if user's login data is stil valid and reload user roles.
|
666
|
+
#
|
667
|
+
# @param [Time] repeat_after : Check is repeated after time. This is by default performed every 24 hours.
|
668
|
+
##########################################################################
|
669
|
+
def dc_check_user_still_valid(repeat_after=1.day)
|
670
|
+
# not needed
|
671
|
+
return if session[:user_id].nil?
|
672
|
+
# last check more than a day ago
|
673
|
+
if (session[:user_chk] ||= Time.now) < repeat_after.ago
|
674
|
+
user_id = session[:user_id]
|
675
|
+
clear_login_data
|
676
|
+
# reload user roles
|
677
|
+
user = DcUser.find( user_id ) rescue nil
|
678
|
+
fill_login_data(user)
|
679
|
+
session[:user_chk] = Time.now
|
680
|
+
end
|
681
|
+
end
|
682
|
+
|
683
|
+
##########################################################################
|
684
|
+
# Evaluates Class.method in more predictable context then just calling eval
|
685
|
+
#
|
686
|
+
# @param [String] class_method defined as MyClass.method_name
|
687
|
+
# @param [Object] optional parameters send to class_method
|
688
|
+
##########################################################################
|
689
|
+
def dc_eval_class_method(class_method, params=nil)
|
690
|
+
klass, method = class_method.split('.')
|
691
|
+
# check if class exists
|
692
|
+
klass = klass.classify.constantize rescue nil
|
693
|
+
if klass.nil?
|
694
|
+
logger.error " Class in #{class_method} not defined!"
|
695
|
+
return nil
|
696
|
+
end
|
697
|
+
# call method
|
698
|
+
if klass.respond_to?(method)
|
699
|
+
klass.send(method, params)
|
700
|
+
else
|
701
|
+
logger.error "Method in #{class_method} not defined!"
|
702
|
+
nil
|
703
|
+
end
|
704
|
+
end
|
705
|
+
|
706
|
+
##########################################################################
|
707
|
+
# Will add new element to json_ld structure
|
708
|
+
#
|
709
|
+
# Parameters:
|
710
|
+
# [element] Hash or Array of hashes:
|
711
|
+
##########################################################################
|
712
|
+
def dc_add_json_ld(element)
|
713
|
+
@json_ld ||= []
|
714
|
+
if element.class == Array
|
715
|
+
@json_ld += element
|
716
|
+
else
|
717
|
+
@json_ld << element
|
718
|
+
end
|
719
|
+
end
|
720
|
+
|
721
|
+
########################################################################
|
722
|
+
# Will add a meta tag to internal hash structure. If meta tag already exists it
|
723
|
+
# will be overwritten.
|
724
|
+
#
|
725
|
+
# Parameters:
|
726
|
+
# [name] String: meta name
|
727
|
+
# [content] String: meta content
|
728
|
+
#
|
729
|
+
########################################################################
|
730
|
+
def dc_add_meta_tag(type, name, content)
|
731
|
+
return if content.blank?
|
732
|
+
@meta_tags ||= {}
|
733
|
+
key = "#{type}=\"#{name}\""
|
734
|
+
@meta_tags[key] = content
|
735
|
+
end
|
736
|
+
|
737
|
+
########################################################################
|
738
|
+
# Will prepare flash[:update] data, which will be used for updating fields
|
739
|
+
# on forms parent form fields.
|
740
|
+
#
|
741
|
+
# Parameters:
|
742
|
+
# [field_name] String: Field name
|
743
|
+
# [value] String: New value
|
744
|
+
# [readonly] Boolean: Field is readonly
|
745
|
+
#
|
746
|
+
########################################################################
|
747
|
+
def dc_update_form_field(field_name, value, readonly=false)
|
748
|
+
key_name = (readonly ? 'td_' : '') + "record_#{field_name}"
|
749
|
+
flash[:update] ||= {}
|
750
|
+
flash[:update][key_name] = value
|
751
|
+
end
|
752
|
+
|
753
|
+
####################################################################
|
754
|
+
# Checks if any errors exist on document and writes error log. It can also
|
755
|
+
# crash if requested. This is mostly usefull in development for debuging
|
756
|
+
# model errors or when updating multiple collections and each save must be
|
757
|
+
# checked if succesfull.
|
758
|
+
#
|
759
|
+
# @param [Document] Document object which will be checked
|
760
|
+
# @param [Boolean] If true method should end in runtime error. Default = false.
|
761
|
+
#
|
762
|
+
# @return [String] Error messages or empty string if everything is OK.
|
763
|
+
#
|
764
|
+
# @Example Check for error when data is saved.
|
765
|
+
# model.save
|
766
|
+
# if (msg = DcApplicationController.dc_check_model(model) ).size > 0
|
767
|
+
# p msg
|
768
|
+
# error process ......
|
769
|
+
# end
|
770
|
+
#
|
771
|
+
####################################################################
|
772
|
+
def self.dc_check_model(document, crash=false)
|
773
|
+
return nil unless document.errors.any?
|
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
|
786
|
+
end
|
787
|
+
|
788
|
+
########################################################################
|
789
|
+
# Will dump exception to rails log and console.
|
790
|
+
#
|
791
|
+
# Parameters:
|
792
|
+
# [exception] Object: Exception caught
|
793
|
+
#
|
794
|
+
########################################################################
|
795
|
+
def dc_dump_exception(exception)
|
796
|
+
msg = [exception.message, *exception.backtrace].join($/)
|
797
|
+
pp msg
|
798
|
+
Rails.logger.error msg
|
799
|
+
end
|
800
|
+
|
801
|
+
|
579
802
|
end
|
@@ -45,7 +45,12 @@ layout false
|
|
45
45
|
# JSON array [label, value, id] of first 20 documents that confirm to query.
|
46
46
|
########################################################################
|
47
47
|
def autocomplete
|
48
|
-
#
|
48
|
+
# table parameter must be defined. If not, get it from search parameter
|
49
|
+
if params['table'].nil? and params['search'].match(/\./)
|
50
|
+
name = params['search'].split('.').first
|
51
|
+
params['table'] = name.underscore
|
52
|
+
end
|
53
|
+
|
49
54
|
return render plain: t('drgcms.not_authorized') unless dc_user_can(DcPermission::CAN_VIEW)
|
50
55
|
# TODO Double check if previous line works as it should.
|
51
56
|
table = params['table'].classify.constantize
|
@@ -55,7 +60,7 @@ def autocomplete
|
|
55
60
|
a = if params['search'].match(/\./)
|
56
61
|
name, method = params['search'].split('.')
|
57
62
|
table.send(method, params['input']).inject([]) do |r,v|
|
58
|
-
r << { label: v[0], value: v[0], id: v[1].to_s }
|
63
|
+
r << { label: v[0], value: v[0], id: (v[1] || v[0]).to_s }
|
59
64
|
end
|
60
65
|
# simply search which will search and return field_name defined in params['search']
|
61
66
|
else
|
@@ -64,7 +69,7 @@ def autocomplete
|
|
64
69
|
end
|
65
70
|
end
|
66
71
|
|
67
|
-
render
|
72
|
+
render plain: a.to_json
|
68
73
|
end
|
69
74
|
|
70
75
|
########################################################################
|
@@ -88,13 +93,24 @@ end
|
|
88
93
|
##########################################################################
|
89
94
|
def toggle_edit_mode
|
90
95
|
session[:edit_mode] ||= 0
|
91
|
-
#
|
92
|
-
if session[:edit_mode] < 1
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
96
|
+
# error when not logged in
|
97
|
+
return dc_render_404 if session[:edit_mode] < 1
|
98
|
+
# if return_to_ypos parameter is present it will forward it and thus scroll to
|
99
|
+
# aproximate position it was when toggle was clicked
|
100
|
+
session[:edit_mode] = (session[:edit_mode] == 1) ? 2 : 1
|
101
|
+
uri = Rack::Utils.parse_nested_query(request.url)
|
102
|
+
# it parses only on & so first (return_to) parameter also contains url
|
103
|
+
url = uri.first.last
|
104
|
+
if (i = url.index('return_to_ypos')).to_i > 0
|
105
|
+
url = url[0,i-1]
|
106
|
+
end
|
107
|
+
# offset CMS menu
|
108
|
+
if (ypos = uri['return_to_ypos'].to_i) > 0
|
109
|
+
ypos += session[:edit_mode] == 2 ? 250 : -250
|
97
110
|
end
|
111
|
+
url << (url.match(/\?/) ? '&' : '?')
|
112
|
+
url << "return_to_ypos=#{ypos}"
|
113
|
+
redirect_to url
|
98
114
|
end
|
99
115
|
|
100
116
|
####################################################################
|
@@ -105,7 +121,7 @@ def process_login
|
|
105
121
|
return dc_render_404 unless ( params[:record] and params[:record][:username] and params[:record][:password] )
|
106
122
|
|
107
123
|
unless params[:record][:password].blank? #password must not be empty
|
108
|
-
user = DcUser.find_by(username: params[:record][:username])
|
124
|
+
user = DcUser.find_by(username: params[:record][:username], active: true)
|
109
125
|
if user and user.authenticate(params[:record][:password])
|
110
126
|
fill_login_data(user, params[:record][:remember_me].to_i == 1)
|
111
127
|
return redirect_to params[:return_to] || '/'
|
@@ -130,7 +146,7 @@ end
|
|
130
146
|
def login
|
131
147
|
if cookies.signed[:remember_me]
|
132
148
|
user = DcUser.find(cookies.signed[:remember_me])
|
133
|
-
if user
|
149
|
+
if user and user.active
|
134
150
|
fill_login_data(user, true)
|
135
151
|
return redirect_to params[:return_to]
|
136
152
|
|
@@ -149,7 +165,7 @@ end
|
|
149
165
|
def restore_from_journal
|
150
166
|
# Only administrators can perform this operation
|
151
167
|
unless dc_user_has_role('admin')
|
152
|
-
return render
|
168
|
+
return render plain: { 'msg_info' => (t ('drgcms.not_authorized')) }.to_json
|
153
169
|
end
|
154
170
|
# selected fields to hash
|
155
171
|
restore = {}
|
@@ -178,7 +194,7 @@ def restore_from_journal
|
|
178
194
|
# TODO Error checking
|
179
195
|
{ 'msg_info' => (t ('drgcms.dc_journal.restored')) }
|
180
196
|
end
|
181
|
-
render
|
197
|
+
render plain: result.to_json
|
182
198
|
end
|
183
199
|
|
184
200
|
########################################################################
|
@@ -236,8 +252,54 @@ def paste_clipboard
|
|
236
252
|
dc_render_ajax(div: 'result', value: result )
|
237
253
|
end
|
238
254
|
|
255
|
+
########################################################################
|
256
|
+
# Will add new json_ld element with blank structure into dc_json_ld field on a
|
257
|
+
# document.
|
258
|
+
########################################################################
|
259
|
+
def add_json_ld_schema
|
260
|
+
edited_document = DcJsonLd.find_document_by_ids(params[:table], params[:ids])
|
261
|
+
yaml = YAML.load_file( dc_find_form_file('json_ld_schema') )
|
262
|
+
schema_data = yaml[params[:schema]]
|
263
|
+
# Existing document
|
264
|
+
if edited_document.dc_json_lds.find_by(type: "@#{params[:schema]}")
|
265
|
+
return render json: {'msg_error' => t('helpers.help.dc_json_ld.add_error', schema: params[:schema] ) }
|
266
|
+
else
|
267
|
+
add_empty_json_ld_schema(edited_document, schema_data, params[:schema], params[:schema], yaml)
|
268
|
+
end
|
269
|
+
render json: {'reload_' => 1}
|
270
|
+
end
|
271
|
+
|
239
272
|
protected
|
240
273
|
|
274
|
+
########################################################################
|
275
|
+
# Subroutine of add_json_ld_schema for adding one element
|
276
|
+
########################################################################
|
277
|
+
def add_empty_json_ld_schema(edited_document, schema, schema_name, schema_type, yaml) #:nodoc
|
278
|
+
data = {}
|
279
|
+
doc = DcJsonLd.new
|
280
|
+
doc.name = schema_name
|
281
|
+
doc.type = schema_type
|
282
|
+
|
283
|
+
edited_document.dc_json_lds << doc
|
284
|
+
schema.each do |element_name, element|
|
285
|
+
next if element_name == 'level' # skip level element
|
286
|
+
if yaml[element['type']]
|
287
|
+
if element['n'].to_s == '1'
|
288
|
+
# single element
|
289
|
+
doc_1 = yaml[element['type'] ]
|
290
|
+
data[element_name] = doc_1
|
291
|
+
else
|
292
|
+
# array
|
293
|
+
add_empty_json_ld_schema(doc, yaml[element['type']], element_name, element['type'], yaml)
|
294
|
+
end
|
295
|
+
else
|
296
|
+
data[element_name] = element['text']
|
297
|
+
end
|
298
|
+
end
|
299
|
+
doc.data = data.to_yaml
|
300
|
+
doc.save
|
301
|
+
end
|
302
|
+
|
241
303
|
########################################################################
|
242
304
|
# Update some anomalies in json data on paste_clipboard action.
|
243
305
|
########################################################################
|
@@ -282,54 +344,4 @@ def process_document(line, table, id, ids)
|
|
282
344
|
msg ? " ERROR! #{msg}" : " NEW. OK."
|
283
345
|
end
|
284
346
|
|
285
|
-
####################################################################
|
286
|
-
# Clears all session data related to login.
|
287
|
-
####################################################################
|
288
|
-
def clear_login_data
|
289
|
-
session[:edit_mode] = 0
|
290
|
-
session[:user_id] = nil
|
291
|
-
session[:user_name] = nil
|
292
|
-
session[:user_roles] = nil
|
293
|
-
cookies.delete :remember_me
|
294
|
-
end
|
295
|
-
|
296
|
-
####################################################################
|
297
|
-
# Fills session with data related to successful login.
|
298
|
-
####################################################################
|
299
|
-
def fill_login_data(user, remember_me)
|
300
|
-
session[:user_id] = user.id
|
301
|
-
session[:user_name] = user.name
|
302
|
-
session[:edit_mode] = 0
|
303
|
-
session[:user_roles] = []
|
304
|
-
|
305
|
-
# special for SUPERADMIN
|
306
|
-
sa = DcPolicyRole.find_by(system_name: 'superadmin')
|
307
|
-
if sa and (role = user.dc_user_roles.find_by(dc_policy_role_id: sa.id))
|
308
|
-
session[:user_roles] << role.dc_policy_role_id
|
309
|
-
session[:edit_mode] = 2
|
310
|
-
return
|
311
|
-
end
|
312
|
-
# Every user has guest role
|
313
|
-
guest = DcPolicyRole.find_by(system_name: 'guest')
|
314
|
-
session[:user_roles] << guest.id if guest
|
315
|
-
# read default policy from site
|
316
|
-
default_policy = dc_get_site().dc_policies.find_by(is_default: true)
|
317
|
-
# load user roles
|
318
|
-
user.dc_user_roles.each do |role|
|
319
|
-
next unless role.active
|
320
|
-
next if role.valid_from and role.valid_from > Time.now.end_of_day.to_date
|
321
|
-
next if role.valid_to and role.valid_to < Time.now.to_date
|
322
|
-
# check if role is active in this site
|
323
|
-
policy_role = default_policy.dc_policy_rules.find_by(dc_policy_role_id: role.dc_policy_role_id)
|
324
|
-
next unless policy_role
|
325
|
-
# set edit_mode
|
326
|
-
session[:edit_mode] = 1 if policy_role.permission > 1
|
327
|
-
session[:user_roles] << role.dc_policy_role_id
|
328
|
-
end
|
329
|
-
# Save remember me cookie if not CMS user and remember me is selected
|
330
|
-
if session[:edit_mode] == 0 and remember_me
|
331
|
-
cookies.signed[:remember_me] = { :value => user.id, :expires => 180.days.from_now}
|
332
|
-
end
|
333
|
-
end
|
334
|
-
|
335
347
|
end
|