drg_cms 0.6.0.8 → 0.6.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/javascripts/drg_cms/drg_cms.js +100 -58
- data/app/assets/stylesheets/drg_cms/drg_cms.css +177 -43
- data/app/controllers/cmsedit_controller.rb +149 -145
- data/app/controllers/dc_application_controller.rb +235 -113
- data/app/controllers/dc_common_controller.rb +32 -3
- data/app/controls/dc_help_control.rb +126 -0
- data/app/controls/dc_report.rb +5 -7
- data/app/forms/all_options.yml +10 -4
- data/app/forms/cms_menu.yml +7 -1
- data/app/forms/dc_category.yml +2 -1
- data/app/forms/dc_design.yml +1 -0
- data/app/forms/dc_help_1.yml +109 -0
- data/app/forms/dc_journal.yml +3 -1
- data/app/forms/dc_link.yml +1 -1
- data/app/forms/dc_menu.yml +2 -0
- data/app/forms/dc_menu_item.yml +1 -0
- data/app/forms/dc_page.yml +2 -0
- data/app/forms/dc_part.yml +1 -0
- data/app/forms/dc_piece.yml +1 -0
- data/app/forms/dc_poll.yml +3 -0
- data/app/forms/dc_simple_menu.yml +2 -0
- data/app/forms/dc_site.yml +2 -6
- data/app/forms/dc_user.yml +27 -11
- data/app/forms/dc_user_role.yml +3 -0
- data/app/helpers/cms_common_helper.rb +69 -4
- data/app/helpers/cms_edit_helper.rb +32 -24
- data/app/helpers/cms_helper.rb +64 -26
- data/app/helpers/cms_index_helper.rb +84 -72
- data/app/helpers/dc_application_helper.rb +33 -24
- data/app/models/concerns/dc_page_concern.rb +11 -2
- data/app/models/concerns/dc_policy_rule_concern.rb +20 -8
- data/app/models/concerns/dc_site_concern.rb +56 -44
- data/app/models/concerns/dc_user_concern.rb +57 -18
- data/app/models/dc_design.rb +29 -19
- data/app/models/dc_key_value_store.rb +1 -0
- data/app/models/dc_permission.rb +19 -9
- data/app/models/dc_policy.rb +25 -14
- data/app/models/dc_policy_role.rb +22 -11
- data/app/models/dc_temp.rb +1 -1
- data/app/models/dc_user_role.rb +2 -2
- data/app/models/drgcms_form_fields/embedded.rb +5 -8
- data/app/models/drgcms_form_fields/file_field.rb +1 -1
- data/app/models/drgcms_form_fields/file_select.rb +2 -2
- data/app/models/drgcms_form_fields/hash_field.rb +11 -7
- data/app/models/drgcms_form_fields/link_to.rb +2 -2
- data/app/models/drgcms_form_fields/method.rb +5 -4
- data/app/models/drgcms_form_fields/multitext_autocomplete.rb +1 -1
- data/app/models/drgcms_form_fields/select.rb +10 -9
- data/app/models/drgcms_form_fields/text_autocomplete.rb +2 -2
- data/app/views/cmsedit/edit.html.erb +2 -0
- data/app/views/cmsedit/index.html.erb +2 -1
- data/app/views/cmsedit/new.html.erb +2 -0
- data/app/views/dc_common/_help.html.erb +8 -0
- data/app/views/layouts/models.html.erb +2 -1
- data/config/locales/drgcms_en.yml +12 -0
- data/config/locales/drgcms_sl.yml +15 -0
- data/config/locales/models_en.yml +5 -5
- data/config/locales/models_sl.yml +7 -6
- data/lib/drg_cms.rb +58 -0
- data/lib/drg_cms/version.rb +1 -1
- metadata +5 -3
- data/app/models/__dc_dummy.rb +0 -102
@@ -243,8 +243,8 @@ end
|
|
243
243
|
# Helper for adding additional css and javascript code added by documents
|
244
244
|
# and renderers during page rendering.
|
245
245
|
########################################################################
|
246
|
-
def dc_page_bottom
|
247
|
-
%
|
246
|
+
def dc_page_bottom
|
247
|
+
%(<style type="text/css">#{@css}</style>#{javascript_tag @js}).html_safe
|
248
248
|
end
|
249
249
|
|
250
250
|
############################################################################
|
@@ -258,10 +258,16 @@ end
|
|
258
258
|
# Returns:
|
259
259
|
# String. HTML code for title.
|
260
260
|
############################################################################
|
261
|
-
def dc_table_title(text, result_set=nil)
|
262
|
-
c = %
|
261
|
+
def dc_table_title(text, result_set = nil)
|
262
|
+
c = %(<div class="dc-title">#{text})
|
263
|
+
# help button
|
264
|
+
type = result_set.nil? ? 'form' : 'index'
|
265
|
+
form_name = params[:form_name] || params[:table]
|
266
|
+
url = url_for(controller: :dc_common, action: :help, type: type, form_name: form_name)
|
267
|
+
c << %(<div class="dc-help dc-link-ajax" data-url=#{url}>#{fa_icon('question-circle')}</div>)
|
268
|
+
|
263
269
|
if result_set and result_set.respond_to?(:current_page)
|
264
|
-
c << %
|
270
|
+
c << %(<div class="dc-paginate">#{paginate(result_set, :params => {action: 'index', clear: 'no', filter: nil})}</div>)
|
265
271
|
end
|
266
272
|
c << '<div style="clear: both;"></div></div>'
|
267
273
|
c.html_safe
|
@@ -273,7 +279,7 @@ end
|
|
273
279
|
# Returns:
|
274
280
|
# String. HTML code for title.
|
275
281
|
############################################################################
|
276
|
-
def dc_edit_title
|
282
|
+
def dc_edit_title
|
277
283
|
session[:form_processing] = "form:title:"
|
278
284
|
title = @form['form']['title']
|
279
285
|
# defined as form:title:edit
|
@@ -1083,12 +1089,13 @@ def dc_iframe_edit(table, opts={})
|
|
1083
1089
|
end
|
1084
1090
|
|
1085
1091
|
########################################################################
|
1086
|
-
# Will return value from
|
1087
|
-
# This objects can be params, session,
|
1092
|
+
# Will return value from Rails and DRG internal objects.
|
1093
|
+
# This objects can be params, session, record, site, page
|
1088
1094
|
#
|
1089
1095
|
# Parameters:
|
1090
|
-
# [object] String: Internal object holding variable.
|
1096
|
+
# [object] String: Internal object holding variable. Possible values are session, params, record, site, page, class
|
1091
1097
|
# [var_name] String[symbol]: Variable name (:user_name, 'user_id', ...)
|
1098
|
+
# [current_document] Object: If passed and object is 'record' then it will be used for retrieving data.
|
1092
1099
|
#
|
1093
1100
|
# Example:
|
1094
1101
|
# # called when constructing iframe for display
|
@@ -1100,26 +1107,28 @@ end
|
|
1100
1107
|
#
|
1101
1108
|
#
|
1102
1109
|
# Returns:
|
1103
|
-
# Value of variable or
|
1110
|
+
# Value of variable or error when not found
|
1104
1111
|
########################################################################
|
1105
|
-
def dc_internal_var(object, var_name)
|
1112
|
+
def dc_internal_var(object, var_name, current_document = nil)
|
1106
1113
|
begin
|
1107
1114
|
case
|
1108
|
-
|
1109
|
-
|
1110
|
-
|
1111
|
-
|
1112
|
-
|
1113
|
-
|
1114
|
-
|
1115
|
-
|
1116
|
-
|
1117
|
-
|
1118
|
-
|
1119
|
-
|
1115
|
+
when object == 'session' then _origin.session[var_name]
|
1116
|
+
when object == 'params' then _origin.params[var_name]
|
1117
|
+
when object == 'site' then _origin.dc_get_site.send(var_name)
|
1118
|
+
when object == 'page' then _origin.page.send(var_name)
|
1119
|
+
when object == 'record' then
|
1120
|
+
current_document ? current_document.send(var_name) : _origin.record.send(var_name)
|
1121
|
+
when object == 'class' then
|
1122
|
+
clas, method_name = var_name.split('.')
|
1123
|
+
klas = clas.classify.constantize
|
1124
|
+
# call method. Error will be caught below.
|
1125
|
+
klas.send(method_name)
|
1126
|
+
else
|
1127
|
+
'VARIABLE: UNKNOWN OBJECT'
|
1120
1128
|
end
|
1121
1129
|
rescue Exception => e
|
1122
|
-
logger.
|
1130
|
+
Rails.logger.debug "\ndc_internal_var. Runtime error. #{e.message}\n"
|
1131
|
+
Rails.logger.debug(e.backtrace.join($/)) if Rails.env.development?
|
1123
1132
|
'VARIABLE: ERROR'
|
1124
1133
|
end
|
1125
1134
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
#coding: utf-8
|
2
1
|
#--
|
3
2
|
# Copyright (c) 2012+ Damjan Rems
|
4
3
|
#
|
@@ -83,6 +82,16 @@ before_save :do_before_save
|
|
83
82
|
|
84
83
|
validates :publish_date, presence: true
|
85
84
|
validate :validate_images_alt_present
|
85
|
+
|
86
|
+
after_save :cache_clear
|
87
|
+
after_destroy :cache_clear
|
88
|
+
|
89
|
+
####################################################################
|
90
|
+
# Clear cache if cache is configured
|
91
|
+
####################################################################
|
92
|
+
def cache_clear
|
93
|
+
DrgCms.cache_clear(:dc_page)
|
94
|
+
end
|
86
95
|
|
87
96
|
######################################################################
|
88
97
|
# Will return subject_link. Field name link should be common for all documents
|
@@ -94,7 +103,7 @@ end
|
|
94
103
|
|
95
104
|
######################################################################
|
96
105
|
# Will return validation error if all images in body field do not have
|
97
|
-
# alt attribute
|
106
|
+
# alt attribute present.
|
98
107
|
######################################################################
|
99
108
|
def validate_images_alt_present
|
100
109
|
errors.add('body', I18n.t('drgcms.img_alt_not_present')) unless DcPage.images_alt_present?(self.body)
|
@@ -25,17 +25,20 @@
|
|
25
25
|
# ActiveSupport::Concern definition for DcPolicyRule class.
|
26
26
|
#########################################################################
|
27
27
|
module DcPolicyRuleConcern
|
28
|
-
|
29
|
-
|
28
|
+
extend ActiveSupport::Concern
|
29
|
+
included do
|
30
30
|
|
31
|
-
|
32
|
-
|
31
|
+
include Mongoid::Document
|
32
|
+
include Mongoid::Timestamps
|
33
33
|
|
34
|
-
|
34
|
+
belongs_to :dc_policy_role
|
35
35
|
|
36
|
-
|
36
|
+
field :permission, type: Integer, default: 0
|
37
37
|
|
38
|
-
|
38
|
+
embedded_in :policy_rules, polymorphic: true
|
39
|
+
|
40
|
+
after_save :cache_clear
|
41
|
+
after_destroy :cache_clear
|
39
42
|
|
40
43
|
#########################################################################
|
41
44
|
# Returns values for permissions ready to be used in select field.
|
@@ -50,7 +53,7 @@ def self.values_for_permissions
|
|
50
53
|
key = 'helpers.label.dc_policy_rule.choices4_permission'
|
51
54
|
c = I18n.t(key)
|
52
55
|
c = I18n.t(key, locale: 'en') if c.class == Hash or c.match( 'translation missing' )
|
53
|
-
c.split(',').inject([]) {|r,e| r << (ar = e.split(':'); [ar.first, ar.last.to_i]) }
|
56
|
+
c.split(',').inject([]) { |r,e| r << (ar = e.split(':'); [ar.first, ar.last.to_i]) }
|
54
57
|
end
|
55
58
|
|
56
59
|
#########################################################################
|
@@ -74,5 +77,14 @@ def self.permission_name_for_value(value)
|
|
74
77
|
'error'
|
75
78
|
end
|
76
79
|
|
80
|
+
private
|
81
|
+
|
82
|
+
####################################################################
|
83
|
+
# Clear cache if cache is configured
|
84
|
+
####################################################################
|
85
|
+
def cache_clear
|
86
|
+
_parent.send(:cache_clear) if _parent.respond_to?(:cache_clear)
|
87
|
+
end
|
88
|
+
|
77
89
|
end
|
78
90
|
end
|
@@ -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: 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
|
@@ -56,8 +56,8 @@ 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: 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}".strip
|
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_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.
|