drg_cms 0.6.0.8 → 0.6.1.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -27,44 +27,55 @@
|
|
27
27
|
module DcSiteConcern
|
28
28
|
extend ActiveSupport::Concern
|
29
29
|
included do
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
30
|
+
|
31
|
+
include Mongoid::Document
|
32
|
+
include Mongoid::Timestamps
|
33
|
+
|
34
|
+
field :name, type: String
|
35
|
+
field :description, type: String
|
36
|
+
field :homepage_link, type: String
|
37
|
+
field :error_link, type: String
|
38
|
+
field :header, type: String, default: ''
|
39
|
+
field :css, type: String, default: ''
|
40
|
+
field :route_name, type: String, default: ''
|
41
|
+
field :page_title, type: String
|
42
|
+
field :document_extension, type: String
|
43
|
+
field :page_table, type: String
|
44
|
+
field :page_class, type: String, default: 'DcPage'
|
45
|
+
field :site_layout, type: String, default: 'content'
|
46
|
+
field :menu_class, type: String, default: 'DcSimpleMenu'
|
47
|
+
field :request_processor, type: String
|
48
|
+
field :files_directory, type: String
|
49
|
+
field :logo, type: String
|
50
|
+
field :active, type: Mongoid::Boolean, default: true
|
51
|
+
field :created_by, type: BSON::ObjectId
|
52
|
+
field :updated_by, type: BSON::ObjectId
|
53
|
+
field :menu_name, type: String
|
54
|
+
field :menu_id, type: BSON::ObjectId
|
55
|
+
field :settings, type: String
|
56
|
+
field :alias_for, type: String
|
57
|
+
field :rails_view, type: String, default: ''
|
58
|
+
field :design, type: String, default: ''
|
59
|
+
field :inherit_policy, type: BSON::ObjectId
|
60
|
+
|
61
|
+
embeds_many :dc_policies
|
62
|
+
embeds_many :dc_parts
|
63
|
+
|
64
|
+
index( { name: 1 }, { unique: true } )
|
65
|
+
index( { alias_for: 1 } )
|
66
|
+
|
67
|
+
validates :name, presence: true
|
68
|
+
validates :name, uniqueness: true
|
69
|
+
|
70
|
+
after_save :cache_clear
|
71
|
+
after_destroy :cache_clear
|
72
|
+
|
73
|
+
####################################################################
|
74
|
+
# Clear cache if cache is configured
|
75
|
+
####################################################################
|
76
|
+
def cache_clear
|
77
|
+
DrgCms.cache_clear(:dc_site)
|
78
|
+
end
|
68
79
|
|
69
80
|
########################################################################
|
70
81
|
# Returns value of site setting. If no value is send as parameter it returns
|
@@ -78,14 +89,14 @@ end
|
|
78
89
|
########################################################################
|
79
90
|
# Returns class object of collection name
|
80
91
|
########################################################################
|
81
|
-
def page_klass
|
92
|
+
def page_klass
|
82
93
|
(self.page_table.blank? ? self.page_class : self.page_table).classify.constantize
|
83
94
|
end
|
84
95
|
|
85
96
|
########################################################################
|
86
97
|
# Returns class object of menu collection name
|
87
98
|
########################################################################
|
88
|
-
def menu_klass
|
99
|
+
def menu_klass
|
89
100
|
(menu_class.blank? ? 'DcMenu' : menu_class).classify.constantize
|
90
101
|
end
|
91
102
|
|
@@ -99,12 +110,13 @@ end
|
|
99
110
|
|
100
111
|
########################################################################
|
101
112
|
# Return choices for selecting policies for the site
|
113
|
+
# @deprecated
|
102
114
|
########################################################################
|
103
|
-
def self.choices4_policies
|
104
|
-
site = ApplicationController.dc_get_site_()
|
115
|
+
#def self.choices4_policies
|
116
|
+
# site = ApplicationController.dc_get_site_()
|
105
117
|
#all.inject([]) { |r,site| r << [ (site.active ? '' : t('drgcms.disabled') ) + site.name, site._id] }
|
106
|
-
[['a','b']]
|
107
|
-
end
|
118
|
+
# [['a','b']]
|
119
|
+
#end
|
108
120
|
|
109
121
|
########################################################################
|
110
122
|
# Return choices for selecting policies for the site
|
@@ -50,14 +50,14 @@ field :picture, type: String
|
|
50
50
|
field :birthdate, type: Date
|
51
51
|
field :about, type: String
|
52
52
|
field :last_visit, type: Time
|
53
|
-
field :active, type: Boolean, default: true
|
53
|
+
field :active, type: Mongoid::Boolean, default: true
|
54
54
|
field :valid_from, type: Date
|
55
55
|
field :valid_to, type: Date
|
56
56
|
field :created_by, type: BSON::ObjectId
|
57
57
|
field :updated_by, type: BSON::ObjectId
|
58
58
|
|
59
|
-
field :
|
60
|
-
field :
|
59
|
+
field :group, type: Mongoid::Boolean, default: false # false => User, true => Group
|
60
|
+
field :member, type: Array
|
61
61
|
|
62
62
|
embeds_many :dc_user_roles
|
63
63
|
|
@@ -73,23 +73,17 @@ has_secure_password
|
|
73
73
|
|
74
74
|
index( { username: 1 }, { unique: true } )
|
75
75
|
index( { email: 1 }, { unique: true } )
|
76
|
-
index 'dc_user_roles.dc_policy_role_id' => 1
|
77
|
-
index
|
76
|
+
index 'dc_user_roles.dc_policy_role_id' => 1
|
77
|
+
index member: 1
|
78
|
+
index group: 1
|
78
79
|
|
79
80
|
validates_length_of :username, minimum: 4
|
80
81
|
validates :username, uniqueness: true
|
81
|
-
validates :email, uniqueness: true
|
82
|
-
|
82
|
+
validates :email, uniqueness: true
|
83
|
+
validate :do_validate
|
83
84
|
|
84
|
-
|
85
|
-
|
86
|
-
# when entry is left empty.
|
87
|
-
##########################################################################
|
88
|
-
def do_before_save
|
89
|
-
self.name = "#{self.title} #{self.first_name} #{self.middle_name + ' ' unless self.middle_name.blank?}#{self.last_name}".strip
|
90
|
-
# to ensure unique e-mail
|
91
|
-
self.email = "unknown@#{self.id}" if self.email.to_s.strip.size < 5
|
92
|
-
end
|
85
|
+
before_save :do_before_save
|
86
|
+
before_validation :do_before_validation
|
93
87
|
|
94
88
|
##########################################################################
|
95
89
|
# Checks if user has role 'role_id' defined in his roles.
|
@@ -98,7 +92,7 @@ end
|
|
98
92
|
##########################################################################
|
99
93
|
def has_role?(role_id)
|
100
94
|
return false unless role_id
|
101
|
-
|
95
|
+
|
102
96
|
unless BSON::ObjectId.legal?(role_id)
|
103
97
|
role = DcPolicyRole.get_role(role_id)
|
104
98
|
role_id = role.id if role
|
@@ -111,7 +105,7 @@ end
|
|
111
105
|
# Will return all possible values for country field ready for input in select field.
|
112
106
|
# Values are loaded from github when method is first called.
|
113
107
|
##########################################################################
|
114
|
-
def self.choices4_country
|
108
|
+
def self.choices4_country
|
115
109
|
if @@countries.nil?
|
116
110
|
uri = URI.parse("https://raw.githubusercontent.com/umpirsky/country-list/master/country/cldr/en/country.json")
|
117
111
|
http = Net::HTTP.new(uri.host, uri.port)
|
@@ -125,7 +119,7 @@ def self.choices4_country()
|
|
125
119
|
end
|
126
120
|
|
127
121
|
##########################################################################
|
128
|
-
# Performs
|
122
|
+
# Performs logically test on passed email parameter.
|
129
123
|
#
|
130
124
|
# Parameters:
|
131
125
|
# [email] String: e-mail address
|
@@ -143,5 +137,50 @@ def self.is_email?(email)
|
|
143
137
|
email.to_s =~ /^[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$/
|
144
138
|
end
|
145
139
|
|
140
|
+
##########################################################################
|
141
|
+
# Will return list of available groups
|
142
|
+
##########################################################################
|
143
|
+
def self.groups_for_select
|
144
|
+
where(group: true, active: true).order_by(name: 1).inject([]) { |r, e| r << [e.name, e.id] }
|
145
|
+
end
|
146
|
+
|
147
|
+
private
|
148
|
+
|
149
|
+
##########################################################################
|
150
|
+
# before_save callback takes care of name field and ensures that e-mail is unique
|
151
|
+
# when entry is left empty.
|
152
|
+
##########################################################################
|
153
|
+
def do_before_save
|
154
|
+
self.name = "#{title} #{first_name} #{middle_name + ' ' unless middle_name.blank?}#{last_name}".squish
|
155
|
+
# to ensure unique e-mail
|
156
|
+
self.email = "unknown@#{id}" if email.blank?
|
157
|
+
end
|
158
|
+
|
159
|
+
##########################################################################
|
160
|
+
# Create random password for groups. Must be done before validation
|
161
|
+
##########################################################################
|
162
|
+
def do_before_validation
|
163
|
+
if new_record? && group
|
164
|
+
self.password = DcUser.random_password(30)
|
165
|
+
self.password_confirmation = password
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
##########################################################################
|
170
|
+
# Perform some additional validations
|
171
|
+
##########################################################################
|
172
|
+
def do_validate
|
173
|
+
if group && member.present?
|
174
|
+
errors.add('member', I18n.t('errors.messages.present'))
|
175
|
+
end
|
176
|
+
end
|
177
|
+
##########################################################################
|
178
|
+
# Will create random password
|
179
|
+
##########################################################################
|
180
|
+
def self.random_password(number)
|
181
|
+
charset = Array('A'..'Z') + Array('0'..'9') + Array('a'..'z')
|
182
|
+
Array.new(number) { charset.sample }.join
|
183
|
+
end
|
184
|
+
|
146
185
|
end
|
147
186
|
end
|
data/app/models/dc_big_table.rb
CHANGED
@@ -78,10 +78,10 @@ class DcBigTable
|
|
78
78
|
########################################################################
|
79
79
|
# Will return possible choices for specified key prepared for usega in select input field.
|
80
80
|
########################################################################
|
81
|
-
def self.choices4(key, site, locale=nil)
|
81
|
+
def self.choices4(key, site = nil, locale = nil)
|
82
82
|
result = []
|
83
83
|
choices = find_by(key: key, site: site)
|
84
|
-
choices = find_by(key: key, site: nil) if choices.nil?
|
84
|
+
choices = find_by(key: key, site: nil) if site && choices.nil?
|
85
85
|
if choices
|
86
86
|
choices.dc_big_table_values.each do |choice|
|
87
87
|
description = choice.description
|
data/app/models/dc_design.rb
CHANGED
@@ -87,25 +87,35 @@
|
|
87
87
|
# <style type="text/css"><%= @css.html_safe %></style><%= javascript_tag @js %>
|
88
88
|
########################################################################
|
89
89
|
class DcDesign
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
90
|
+
include Mongoid::Document
|
91
|
+
include Mongoid::Timestamps
|
92
|
+
|
93
|
+
field :description, type: String, default: ''
|
94
|
+
field :body, type: String, default: ''
|
95
|
+
field :css, type: String, default: ''
|
96
|
+
field :rails_view, type: String, default: ''
|
97
|
+
field :control, type: String, default: ''
|
98
|
+
field :params, type: String, default: ''
|
99
|
+
field :control_method, type: String, default: ''
|
100
|
+
field :author, type: String
|
101
|
+
field :active, type: Boolean, default: true
|
102
|
+
field :created_by, type: BSON::ObjectId
|
103
|
+
field :updated_by, type: BSON::ObjectId
|
104
|
+
field :site_id, type: BSON::ObjectId
|
105
|
+
|
106
|
+
embeds_many :dc_parts
|
107
|
+
|
108
|
+
validates_length_of :description, minimum: 5
|
109
|
+
|
110
|
+
after_save :cache_clear
|
111
|
+
after_destroy :cache_clear
|
112
|
+
|
113
|
+
####################################################################
|
114
|
+
# Clear cache if cache is configured
|
115
|
+
####################################################################
|
116
|
+
def cache_clear
|
117
|
+
DrgCms.cache_clear(:dc_design)
|
118
|
+
end
|
109
119
|
|
110
120
|
########################################################################
|
111
121
|
# Return choices for select for design_id.
|
data/app/models/dc_filter.rb
CHANGED
@@ -106,8 +106,9 @@ end
|
|
106
106
|
############################################################################
|
107
107
|
# Return filter input field for entering variable filter values on index form
|
108
108
|
############################################################################
|
109
|
-
def self.get_filter_field(parent)
|
109
|
+
def self.get_filter_field(parent)
|
110
110
|
return '' if parent.session[ parent.form['table'] ].nil?
|
111
|
+
|
111
112
|
filter = parent.session[ parent.form['table'] ][:filter]
|
112
113
|
return '' if filter.nil?
|
113
114
|
|
@@ -115,8 +116,11 @@ def self.get_filter_field(parent)
|
|
115
116
|
return '' if filter.nil?
|
116
117
|
|
117
118
|
field = get_field_form_definition(filter['field'], parent)
|
118
|
-
return '' if field.nil?
|
119
|
-
|
119
|
+
return '' if field.nil? && filter['input'].nil?
|
120
|
+
|
121
|
+
saved_readonly = parent.form['readonly']
|
122
|
+
parent.form['readonly'] = false # must be
|
123
|
+
field ||= {}
|
120
124
|
# If field has choices available in labels, use them. This is most likely select input field.
|
121
125
|
if field['name']
|
122
126
|
choices = parent.t('helpers.label.' + parent.form['table'] + '.choices4_' + field['name'] )
|
@@ -129,35 +133,37 @@ def self.get_filter_field(parent)
|
|
129
133
|
field['type'] = filter['input'] if filter['input'].to_s.size > 5
|
130
134
|
field['type'] ||= 'text_field'
|
131
135
|
field['readonly'] = false # must be
|
132
|
-
field['html'] ||= {}
|
133
|
-
field['html']['size']
|
136
|
+
field['html'] ||= {}
|
137
|
+
field['html']['size'] = 20
|
134
138
|
# Start with last entered value
|
135
139
|
field['html']['value'] = filter['value'] unless filter['value'] == '#NIL'
|
136
140
|
field['html']['selected'] = field['html']['value'] # for select field
|
137
141
|
# url for filter ON action
|
138
142
|
field['html']['data-url'] = parent.url_for(
|
139
|
-
controller: 'cmsedit',action: :index, filter: 'on',
|
143
|
+
controller: 'cmsedit', action: :index, filter: 'on',
|
140
144
|
table: parent.form['table'], form_name: parent.params['form_name'])
|
141
145
|
url = field['html']['data-url']
|
142
146
|
# remove if present
|
143
147
|
field['with_new'] = nil if field['with_new']
|
144
|
-
# create input field object
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
# return data from object and create html code to display field
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
148
|
+
# create input field object
|
149
|
+
html = ''
|
150
|
+
klass_string = field['type'].camelize
|
151
|
+
klass = DrgcmsFormFields::const_get(klass_string) rescue nil
|
152
|
+
# return data from object and create html code to display field
|
153
|
+
if klass
|
154
|
+
if drg_field = klass.new(parent, nil, field).render rescue nil
|
155
|
+
js = drg_field.js.blank? ? '' : parent.javascript_tag(drg_field.js)
|
156
|
+
html = %(<li class="no-background">
|
157
|
+
<span class="filter_field" data-url="#{url}">#{drg_field.html}
|
158
|
+
#{parent.fa_icon('search lg', class: 'record_filter_field_icon')}
|
159
|
+
#{js}</span></li>)
|
160
|
+
else
|
161
|
+
# Error. Forget filter
|
162
|
+
parent.session[ parent.form['table'] ][:filter] = nil
|
163
|
+
end
|
154
164
|
end
|
155
|
-
|
156
|
-
|
157
|
-
<span class="filter_field" data-url="#{url}">#{object.html}
|
158
|
-
#{parent.fa_icon('search lg', class: 'record_filter_field_icon')}
|
159
|
-
#{js}</span>
|
160
|
-
</li>]
|
165
|
+
parent.form['readonly'] = saved_readonly
|
166
|
+
html
|
161
167
|
end
|
162
168
|
|
163
169
|
######################################################################
|
data/app/models/dc_permission.rb
CHANGED
@@ -44,23 +44,23 @@ class DcPermission
|
|
44
44
|
#- Available permissions settings
|
45
45
|
|
46
46
|
# User has no access
|
47
|
-
NO_ACCESS
|
47
|
+
NO_ACCESS = 0
|
48
48
|
# User can view documents
|
49
|
-
CAN_VIEW
|
49
|
+
CAN_VIEW = 1
|
50
50
|
# User can create new documents
|
51
|
-
CAN_CREATE
|
51
|
+
CAN_CREATE = 2
|
52
52
|
# User can edit his own documents
|
53
|
-
CAN_EDIT
|
53
|
+
CAN_EDIT = 4
|
54
54
|
# User can edit all documents in collection
|
55
|
-
CAN_EDIT_ALL
|
55
|
+
CAN_EDIT_ALL = 8
|
56
56
|
# User can delete his own documents
|
57
|
-
CAN_DELETE
|
57
|
+
CAN_DELETE = 16
|
58
58
|
# User can delete all documents in collection
|
59
59
|
CAN_DELETE_ALL = 32
|
60
60
|
# User can admin collection (same as can_delete_all, but can see documents which do not belong to current site)
|
61
|
-
CAN_ADMIN
|
61
|
+
CAN_ADMIN = 64
|
62
62
|
# User is superadmin. Basicly same as admin.
|
63
|
-
SUPERADMIN
|
63
|
+
SUPERADMIN = 128
|
64
64
|
|
65
65
|
include Mongoid::Document
|
66
66
|
include Mongoid::Timestamps
|
@@ -75,7 +75,17 @@ embeds_many :dc_policy_rules, as: :policy_rules
|
|
75
75
|
index( { table_name: 1 }, { unique: true } )
|
76
76
|
|
77
77
|
validates :table_name, presence: true
|
78
|
-
validates :table_name, uniqueness: true
|
78
|
+
validates :table_name, uniqueness: true
|
79
|
+
|
80
|
+
after_save :cache_clear
|
81
|
+
after_destroy :cache_clear
|
82
|
+
|
83
|
+
####################################################################
|
84
|
+
# Clear cache if cache is configured
|
85
|
+
####################################################################
|
86
|
+
def cache_clear
|
87
|
+
DrgCms.cache_clear(:dc_permission)
|
88
|
+
end
|
79
89
|
|
80
90
|
########################################################################
|
81
91
|
# Will return choices for permissions prepared for usega in select input field.
|
data/app/models/dc_policy.rb
CHANGED
@@ -45,22 +45,33 @@
|
|
45
45
|
# other policies. Default policy is also used when document has no access policy assigned.
|
46
46
|
#########################################################################
|
47
47
|
class DcPolicy
|
48
|
-
|
49
|
-
|
48
|
+
include Mongoid::Document
|
49
|
+
include Mongoid::Timestamps
|
50
50
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
51
|
+
field :name, type: String
|
52
|
+
field :description, type: String, default: ''
|
53
|
+
field :is_default, type: Boolean, default: false
|
54
|
+
field :active, type: Boolean, default: true
|
55
|
+
field :updated_by, type: BSON::ObjectId
|
56
|
+
field :message, type: String, default: ''
|
57
|
+
|
58
|
+
embeds_many :dc_policy_rules, as: :policy_rules
|
59
|
+
embedded_in :dc_site
|
60
|
+
|
61
|
+
validates :name, length: { minimum: 4 }
|
62
|
+
validates :message, length: { minimum: 5 }
|
63
|
+
|
64
|
+
after_save :cache_clear
|
65
|
+
after_destroy :cache_clear
|
66
|
+
|
67
|
+
####################################################################
|
68
|
+
# Clear cache if cache is configured
|
69
|
+
####################################################################
|
70
|
+
def cache_clear
|
71
|
+
DrgCms.cache_clear(:dc_permission)
|
72
|
+
DrgCms.cache_clear(:dc_site)
|
73
|
+
end
|
60
74
|
|
61
|
-
validates :name, :length => { :minimum => 4 }
|
62
|
-
validates :message, :length => { :minimum => 5 }
|
63
|
-
|
64
75
|
=begin
|
65
76
|
#########################################################################
|
66
77
|
# Returns values for permissions ready to be used in select field.
|
@@ -38,18 +38,29 @@
|
|
38
38
|
# which can be persistent, when application is used as Rails plugin.
|
39
39
|
#########################################################################
|
40
40
|
class DcPolicyRole
|
41
|
-
|
42
|
-
|
41
|
+
include Mongoid::Document
|
42
|
+
include Mongoid::Timestamps
|
43
43
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
44
|
+
field :name, type: String
|
45
|
+
field :system_name, type: String
|
46
|
+
field :active, type: Boolean, default: true
|
47
|
+
|
48
|
+
index( { name: 1 }, { unique: true } )
|
49
|
+
index( system_name: 1 )
|
50
|
+
|
51
|
+
validates :name, :length => { :minimum => 4 }
|
52
|
+
validates :name, uniqueness: true
|
53
|
+
|
54
|
+
after_save :cache_clear
|
55
|
+
after_destroy :cache_clear
|
56
|
+
|
57
|
+
####################################################################
|
58
|
+
# Clear cache if cache is configured
|
59
|
+
####################################################################
|
60
|
+
def cache_clear
|
61
|
+
DrgCms.cache_clear(:dc_permission)
|
62
|
+
DrgCms.cache_clear(:dc_site)
|
63
|
+
end
|
53
64
|
|
54
65
|
########################################################################
|
55
66
|
# Return all defined roles as choices for use in select field.
|
data/app/models/dc_temp.rb
CHANGED
@@ -46,7 +46,7 @@ class DcTemp
|
|
46
46
|
########################################################################
|
47
47
|
def initialize(parms = {})
|
48
48
|
super()
|
49
|
-
parms.stringify_keys
|
49
|
+
parms = parms.nil? ? {} : parms.stringify_keys
|
50
50
|
self.key = parms.delete('key') if parms['key']
|
51
51
|
self.active = parms.delete('active') if parms['active']
|
52
52
|
self.order = parms.delete('order') if parms['order']
|
@@ -137,4 +137,11 @@ def self.prepare(key:, clear: nil)
|
|
137
137
|
self.where(key: key)
|
138
138
|
end
|
139
139
|
|
140
|
+
########################################################################
|
141
|
+
# Order data by new key. Will update order field with values from new field
|
142
|
+
########################################################################
|
143
|
+
def self.reorder_by(key, new_order)
|
144
|
+
self.where(key: key).each { |doc| doc.order = data[key]; doc.save }
|
145
|
+
end
|
146
|
+
|
140
147
|
end
|
data/app/models/dc_user_role.rb
CHANGED
@@ -57,8 +57,8 @@ class DcUserRole
|
|
57
57
|
# Determine of role is still active
|
58
58
|
###############################################################################
|
59
59
|
def active?
|
60
|
-
now = Time.
|
61
|
-
|
60
|
+
now = Time.current
|
61
|
+
active && (valid_from.nil? || now > valid_from) && (valid_to.nil? || now < valid_to)
|
62
62
|
end
|
63
63
|
|
64
64
|
end
|
@@ -31,12 +31,17 @@ module DrgcmsFormFields
|
|
31
31
|
# * +type:+ comment (required)
|
32
32
|
# * +caption:+ Caption text written in label place. If set to false comment
|
33
33
|
# will occupy whole row. (required)
|
34
|
-
#
|
34
|
+
# * +html:+ Optional html attributes will be added to div surrounding the comment.
|
35
|
+
#
|
35
36
|
# Form example:
|
36
37
|
# 30:
|
37
38
|
# type: comment
|
38
39
|
# text: myapp.comment_text
|
39
40
|
# caption: false
|
41
|
+
# html:
|
42
|
+
# style: 'color: red'
|
43
|
+
# class: some_class
|
44
|
+
# id: some_id
|
40
45
|
###########################################################################
|
41
46
|
class Comment < DrgcmsField
|
42
47
|
|
@@ -45,7 +50,11 @@ class Comment < DrgcmsField
|
|
45
50
|
###########################################################################
|
46
51
|
def render
|
47
52
|
comment = @yaml['comment'] || @yaml['text']
|
48
|
-
@html
|
53
|
+
@yaml['html'] ||= {}
|
54
|
+
@yaml['html']['class'] = 'dc-comment ' + @yaml['html']['class'].to_s
|
55
|
+
html = @yaml['html'].inject('') { |r, e| r << %( #{e[0]}="#{e[1]}") }
|
56
|
+
|
57
|
+
@html << %(<div #{html}>#{t(comment, comment).gsub("\n",'<br>')}</div>)
|
49
58
|
self
|
50
59
|
end
|
51
60
|
end
|
@@ -78,6 +78,8 @@ def render
|
|
78
78
|
@yaml['options']['lang'] ||= "'#{I18n.locale}'"
|
79
79
|
@yaml['options']['format'] ||= "'#{t('datetimepicker.formats.date')}'"
|
80
80
|
@yaml['options']['timepicker'] = false
|
81
|
+
@yaml['options']['scrollMonth'] ||= false
|
82
|
+
@yaml['options']['scrollInput'] ||= false
|
81
83
|
|
82
84
|
record = record_text_for(@yaml['name'])
|
83
85
|
@html << @parent.text_field(record, @yaml['name'], @yaml['html'])
|
@@ -135,7 +135,8 @@ def ro_standard(value=nil)
|
|
135
135
|
@record.respond_to?(@yaml['name']) ? @record.send(@yaml['name']) : nil
|
136
136
|
end
|
137
137
|
end
|
138
|
-
|
138
|
+
#@html << (value.blank? ? '' : "<div class='dc-readonly'>#{value}</div>")
|
139
|
+
@html << %(<div id="#{@yaml['name']}" class="dc-readonly">#{value}</div>)
|
139
140
|
self
|
140
141
|
end
|
141
142
|
|