drg_cms 0.6.0.8 → 0.6.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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.
|