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
         |