drg_cms 0.4.39 → 0.4.53
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +49 -0
- data/app/assets/images/drg_cms/file_manager.png +0 -0
- data/app/assets/javascripts/drg_cms/drg_cms.js +8 -8
- data/app/assets/stylesheets/drg_cms/drg_cms.css +22 -20
- data/app/controllers/cmsedit_controller.rb +170 -114
- data/app/controllers/dc_application_controller.rb +142 -56
- data/app/controllers/dc_common_controller.rb +56 -34
- data/app/controllers/dc_main_controller.rb +1 -4
- data/app/controllers/drgcms_controls/dc_page_controls.rb +3 -0
- data/app/forms/all_options.yml +3 -0
- data/app/forms/cms_menu.yml +100 -117
- data/app/forms/dc_design.yml +1 -1
- data/app/forms/dc_ident.yml +37 -0
- data/app/forms/dc_menu_item.yml +1 -1
- data/app/forms/dc_permission.yml +1 -1
- data/app/forms/dc_site.yml +4 -0
- data/app/helpers/cmsedit_helper.rb +44 -80
- data/app/helpers/dc_ad_renderer.rb +27 -15
- data/app/helpers/dc_application_helper.rb +433 -196
- data/app/helpers/dc_big_menu_renderer.rb +40 -40
- data/app/helpers/dc_captcha_renderer.rb +38 -25
- data/app/helpers/dc_common_renderer.rb +15 -48
- data/app/helpers/dc_menu_renderer.rb +30 -20
- data/app/helpers/dc_page_renderer.rb +14 -18
- data/app/helpers/dc_part_renderer.rb +45 -16
- data/app/helpers/dc_piece_renderer.rb +23 -29
- data/app/helpers/dc_poll_renderer.rb +31 -20
- data/app/helpers/dc_renderer.rb +5 -4
- data/app/helpers/dc_simple_menu_renderer.rb +90 -68
- data/app/models/{__dc_global_data.rb → __dc_stat.rb} +20 -21
- data/app/models/dc_ad.rb +13 -1
- data/app/models/dc_ad_stat.rb +6 -0
- data/app/models/dc_big_menu.rb +15 -2
- data/app/models/dc_big_table.rb +27 -4
- data/app/models/dc_big_table_locale.rb +7 -0
- data/app/models/dc_big_table_value.rb +7 -0
- data/app/models/dc_category.rb +9 -3
- data/app/models/dc_design.rb +50 -0
- data/app/models/dc_dummy.rb +41 -1
- data/app/models/dc_folder_permission.rb +9 -2
- data/app/models/{dc_global_data.rb → dc_ident.rb} +20 -22
- data/app/models/dc_journal.rb +9 -1
- data/app/models/dc_key_value_store.rb +41 -4
- data/app/models/dc_link.rb +7 -0
- data/app/models/dc_menu.rb +20 -3
- data/app/models/dc_menu_item.rb +7 -0
- data/app/models/dc_page.rb +31 -12
- data/app/models/dc_part.rb +34 -4
- data/app/models/dc_permission.rb +32 -12
- data/app/models/dc_piece.rb +32 -4
- data/app/models/dc_policy.rb +17 -11
- data/app/models/dc_policy_role.rb +12 -7
- data/app/models/dc_policy_rule.rb +32 -4
- data/app/models/dc_poll.rb +8 -0
- data/app/models/dc_poll_item.rb +6 -0
- data/app/models/dc_simple_menu.rb +18 -3
- data/app/models/dc_simple_menu_item.rb +20 -2
- data/app/models/dc_site.rb +13 -3
- data/app/models/dc_stat.rb +8 -1
- data/app/models/dc_user.rb +18 -2
- data/app/models/dc_user_role.rb +7 -0
- data/app/models/dc_visit.rb +5 -0
- data/app/{helpers → models}/drgcms_form_field.rb +171 -73
- data/app/views/__dc_at_the_beginning/create.html.erb +9 -0
- data/app/views/__dc_at_the_beginning/index.html.erb +19 -0
- data/app/views/cmsedit/_edit_stuff.html.erb +2 -0
- data/app/views/cmsedit/_form.html.erb +0 -1
- data/app/views/dc_mail/subscribe.html.erb +0 -0
- data/config/initializers/kaminari_patch.rb +5 -4
- data/config/locales/drgcms_en.yml +4 -0
- data/config/locales/drgcms_sl.yml +1 -0
- data/config/locales/models_en.yml +14 -3
- data/config/locales/models_sl.yml +13 -4
- data/drg_cms.gemspec +4 -4
- data/lib/drg_cms.rb +37 -8
- data/lib/drg_cms/engine.rb +2 -2
- data/lib/drg_cms/version.rb +3 -2
- data/lib/tasks/at_the_beginning.yml +0 -0
- data/lib/tasks/dc_at_the_beginning.rake +118 -0
- data/lib/tasks/dc_cleanup.rake +19 -7
- data/lib/tasks/log_statistics.rb +66 -0
- data/lib/tasks/site_statistics.rake +29 -12
- data/test/dummy/app/controllers/application_controller.rb +1 -1
- data/test/dummy/app/helpers/application_helper.rb +1 -1
- metadata +15 -26
- data/README.rdoc +0 -3
- data/app/controllers/dc_at_the_beginning_controller.rb +0 -120
- data/app/controllers/dc_mail_controller.rb +0 -89
- data/app/forms/dc_forum_cat.yml +0 -54
- data/app/forms/dc_forum_forum.yml +0 -53
- data/app/forms/dc_forum_msg.yml +0 -124
- data/app/forms/dc_forum_privmsg.yml +0 -125
- data/app/forms/dc_forum_topic.yml +0 -131
- data/app/forms/dc_mail.yml +0 -88
- data/app/forms/dc_mail_address.yml +0 -56
- data/app/forms/dc_mail_list.yml +0 -44
- data/app/forms/dc_mail_list_member.yml +0 -42
- data/app/helpers/dc_mail_renderer.rb +0 -76
- data/app/models/dc_mail.rb +0 -64
- data/app/models/dc_mail_address.rb +0 -69
- data/app/models/dc_mail_list.rb +0 -48
- data/app/models/dc_mail_list_member.rb +0 -34
- data/app/models/dc_sendmail.rb +0 -48
@@ -21,31 +21,47 @@
|
|
21
21
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
22
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
23
|
#++
|
24
|
+
|
25
|
+
##########################################################################
|
26
|
+
# Controller holds methods which are of use for all application controllers.
|
27
|
+
##########################################################################
|
24
28
|
class DcApplicationController < ActionController::Base
|
25
29
|
protect_from_forgery
|
26
30
|
|
27
31
|
########################################################################
|
28
|
-
# Writes anything passed as parameter to
|
32
|
+
# Writes anything passed as parameter to logger file.
|
29
33
|
#
|
30
34
|
# Very usefull for debuging strange errors.
|
31
35
|
########################################################################
|
32
36
|
def dc_dump(*args)
|
33
37
|
args.each do |arg|
|
34
|
-
|
38
|
+
logger.debug arg.to_s
|
35
39
|
end
|
36
40
|
end
|
37
41
|
|
38
42
|
####################################################################
|
39
|
-
#
|
43
|
+
# Return true if CMS is in edit mode
|
40
44
|
####################################################################
|
41
45
|
def dc_edit_mode?
|
42
46
|
session[:edit_mode] > 1
|
43
47
|
end
|
44
48
|
|
45
49
|
####################################################################
|
46
|
-
#
|
50
|
+
# Checks if user has required role.
|
51
|
+
#
|
52
|
+
# [Parameters:]
|
53
|
+
# [role]
|
54
|
+
# Role can be passed as DcPolicyRole object or as string. If string
|
55
|
+
# is passed, dc_policy_roles files is searched for appropriate role.
|
56
|
+
#
|
57
|
+
# [Return:]
|
58
|
+
# Boolean. True if user has required role added to his profile.
|
59
|
+
#
|
60
|
+
# [Example:]
|
61
|
+
# if dc_user_has_role('admin') ...
|
62
|
+
# if dc_user_has_role('Site editors') ...
|
47
63
|
####################################################################
|
48
|
-
def dc_user_has_role(
|
64
|
+
def dc_user_has_role(role)
|
49
65
|
if role.class == String
|
50
66
|
rol = role
|
51
67
|
role = DcPolicyRole.find_by(name: rol)
|
@@ -57,7 +73,12 @@ def dc_user_has_role( role, user=session[:user_id] )
|
|
57
73
|
end
|
58
74
|
|
59
75
|
####################################################################
|
60
|
-
# Determine site from url and return site
|
76
|
+
# Determine site from url and return site document.
|
77
|
+
#
|
78
|
+
# [Return:]
|
79
|
+
# Site document. If site is not found and not in production environment 'test'
|
80
|
+
# site document is returned. If site has alias set then alias site document is
|
81
|
+
# returned.
|
61
82
|
####################################################################
|
62
83
|
def dc_get_site()
|
63
84
|
return @site if @site
|
@@ -80,24 +101,33 @@ end
|
|
80
101
|
####################################################################
|
81
102
|
# Determine and return site record from url. It would be nice but it is not working.
|
82
103
|
####################################################################
|
83
|
-
def self.dc_get_site_()
|
104
|
+
def self.dc_get_site_() #:nodoc:
|
84
105
|
#self.dc_get_site()
|
85
106
|
end
|
86
107
|
|
87
108
|
########################################################################
|
88
|
-
# Searches forms
|
109
|
+
# Searches forms path for file_name and returns full file name or nil if not found.
|
110
|
+
#
|
111
|
+
# [Parameters:]
|
112
|
+
# [form_file] Additional data can be displayed with error.
|
113
|
+
#
|
114
|
+
# [Return:]
|
115
|
+
# String. Full form file name or nil if not found.
|
89
116
|
########################################################################
|
90
|
-
def dc_find_form_file(
|
117
|
+
def dc_find_form_file(form_file)
|
91
118
|
DrgCms.paths(:forms).reverse.each do |path|
|
92
|
-
f = "#{path}/#{
|
119
|
+
f = "#{path}/#{form_file}.yml"
|
93
120
|
return f if File.exist?(f)
|
94
121
|
end
|
95
|
-
p "Form file #{
|
122
|
+
p "Form file #{form_file} not found!"
|
96
123
|
nil
|
97
124
|
end
|
98
125
|
|
99
126
|
#######################################################################
|
100
|
-
#
|
127
|
+
# Will render public/404.html file with some debug code includded.
|
128
|
+
#
|
129
|
+
# [Parameters:]
|
130
|
+
# [Object where_the_error_is] Additional data can be displayed with error.
|
101
131
|
########################################################################
|
102
132
|
def dc_render_404(where_the_error_is=nil)
|
103
133
|
render(file: "#{Rails.root}/public/404", :status => 404, :layout => false, :formats => [:html],
|
@@ -105,7 +135,8 @@ def dc_render_404(where_the_error_is=nil)
|
|
105
135
|
end
|
106
136
|
|
107
137
|
########################################################################
|
108
|
-
#
|
138
|
+
# Will write document to dc_visits collection unless visit comes from robot.
|
139
|
+
# It also sets session[is_robot] variable to true if robot.
|
109
140
|
########################################################################
|
110
141
|
def dc_log_visit()
|
111
142
|
if request.env["HTTP_USER_AGENT"] and request.env["HTTP_USER_AGENT"].match(/\(.*https?:\/\/.*\)/)
|
@@ -126,31 +157,34 @@ protected
|
|
126
157
|
#############################################################################
|
127
158
|
# Add permissions. Subroutine of dc_user_can
|
128
159
|
############################################################################
|
129
|
-
def
|
160
|
+
def add_permissions_for(table_name=nil) # :nodoc:
|
130
161
|
perm = table_name.nil? ? DcPermission.find_by(is_default: true) : DcPermission.find_by(table_name: table_name, active: true)
|
131
162
|
(perm.dc_policy_rules.each {|p1| @permissions[p1.dc_policy_role_id] = p1.permission }) if perm
|
132
163
|
end
|
133
164
|
|
134
165
|
############################################################################
|
135
|
-
#
|
136
|
-
#
|
166
|
+
# Checks if user can perform (read, create, edit, delete) document in specified
|
167
|
+
# table (collection).
|
168
|
+
#
|
169
|
+
# [Parameters:]
|
170
|
+
# [Integer permission] Required permission level
|
171
|
+
# [String table] Name of table(collection) for which permission is required. Defaults to params[table].
|
137
172
|
#
|
138
|
-
#
|
139
|
-
#
|
173
|
+
# [Returns:]
|
174
|
+
# Boolean true if user's role permits operation on a table(collection) with required permission.
|
140
175
|
#
|
141
|
-
#
|
142
|
-
#
|
143
|
-
# Defaults to params[:table]
|
176
|
+
# [Example:]
|
177
|
+
# dc_user_can(DcPermission::CAN_VIEW, params[:table])
|
144
178
|
############################################################################
|
145
179
|
def dc_user_can(permission, table=params[:table])
|
146
180
|
if @permissions.nil?
|
147
181
|
@permissions = {}
|
148
|
-
|
182
|
+
add_permissions_for # default permission
|
149
183
|
table_name = ''
|
150
184
|
# permission can be set for table or object embedded in table. Read all possible values
|
151
185
|
table.strip.downcase.split(';').each do |t|
|
152
186
|
table_name << (table_name.size > 0 ? ';' : '') + t # table;embedded;another;...
|
153
|
-
|
187
|
+
add_permissions_for table_name
|
154
188
|
end
|
155
189
|
end
|
156
190
|
# Sometimes anonymous user is allowed to use cmsedit. Search for system default role.
|
@@ -165,8 +199,7 @@ def dc_user_can(permission, table=params[:table])
|
|
165
199
|
end
|
166
200
|
|
167
201
|
####################################################################
|
168
|
-
# Detects if called from mobile agent.
|
169
|
-
# According to http://detectmobilebrowsers.com/
|
202
|
+
# Detects if called from mobile agent according to http://detectmobilebrowsers.com/
|
170
203
|
####################################################################
|
171
204
|
def dc_set_is_mobile
|
172
205
|
is_mobile = /(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])
|
@@ -175,7 +208,9 @@ end
|
|
175
208
|
|
176
209
|
|
177
210
|
##########################################################################
|
178
|
-
# Merge values from
|
211
|
+
# Merge values from parameters fields (from site, page ...) into internal @options hash.
|
212
|
+
# [Parameters:]
|
213
|
+
# [String parameters] String in yaml syntax.
|
179
214
|
##########################################################################
|
180
215
|
def dc_set_options(parameters)
|
181
216
|
@options ||= {}
|
@@ -195,9 +230,21 @@ def dc_set_options(parameters)
|
|
195
230
|
end
|
196
231
|
|
197
232
|
##########################################################################
|
198
|
-
#
|
233
|
+
# This is default page process action. It will search for site, page and
|
234
|
+
# design documents, collect parameters from different objects, add CMS edit code if allowed
|
235
|
+
# and at the end render design.body or design.rails_view or site.rails_view.
|
236
|
+
#
|
237
|
+
# [Example:] as defined in routes.rb
|
238
|
+
# get '*path' => 'dc_application_controller#dc_process_default_request'
|
239
|
+
# # or
|
240
|
+
# get '*path' => 'my_controller#page'
|
241
|
+
# # then in my_controller.rb
|
242
|
+
# def page
|
243
|
+
# dc_process_default_request
|
244
|
+
# end
|
245
|
+
#
|
199
246
|
##########################################################################
|
200
|
-
def dc_process_default_request()
|
247
|
+
def dc_process_default_request()
|
201
248
|
session[:edit_mode] ||= 0
|
202
249
|
# Initialize parts
|
203
250
|
@parts = nil
|
@@ -213,11 +260,11 @@ def dc_process_default_request()
|
|
213
260
|
pageclass = @site.page_table.classify.constantize
|
214
261
|
if params[:id]
|
215
262
|
#Page.where(id: params[:id]).or(subject_link: params[:id]).first
|
216
|
-
@page = pageclass.find_by(:dc_site_id.in => [@site._id, nil], subject_link: params[:id])
|
263
|
+
@page = pageclass.find_by(:dc_site_id.in => [@site._id, nil], subject_link: params[:id], active: true)
|
217
264
|
@page = pageclass.find(params[:id]) if @page.nil? # I think that there will be more subject_link searchers than id
|
218
265
|
elsif params[:path]
|
219
266
|
# path may point direct to page's subject_link
|
220
|
-
@page = pageclass.find_by(:dc_site_id.in => [@site._id, nil], subject_link: params[:path])
|
267
|
+
@page = pageclass.find_by(:dc_site_id.in => [@site._id, nil], subject_link: params[:path], active: true)
|
221
268
|
if @page.nil?
|
222
269
|
# no. Find if defined in links
|
223
270
|
link = DcLink.find_by(:dc_site_id.in => [@site._id, nil], name: params[:path])
|
@@ -263,13 +310,17 @@ def dc_process_default_request()
|
|
263
310
|
end
|
264
311
|
|
265
312
|
########################################################################
|
266
|
-
# Decamelizes string. It probably doesn't work
|
267
|
-
#
|
313
|
+
# Decamelizes string. Does oposite from camelize method. It probably doesn't work
|
314
|
+
# very good with non ascii chars. Since this method is used for converting from model
|
315
|
+
# to collection names it is very unwise to use non ascii chars for table (collection) names.
|
316
|
+
#
|
317
|
+
# [Parameters:]
|
318
|
+
# [String string] String to be converted # 'DcSimpleMenu' => 'dc_simple_menu'.
|
268
319
|
########################################################################
|
269
|
-
def decamelize_type(
|
270
|
-
return nil unless
|
320
|
+
def decamelize_type(string)
|
321
|
+
return nil unless string
|
271
322
|
r = ''
|
272
|
-
|
323
|
+
string.to_s.each_char do |c|
|
273
324
|
r << case
|
274
325
|
when r.size == 0 then c.downcase
|
275
326
|
when c.downcase != c then '_' + c.downcase
|
@@ -282,7 +333,11 @@ end
|
|
282
333
|
####################################################################
|
283
334
|
# Return's error messages for the document formated for display on edit form.
|
284
335
|
#
|
285
|
-
#
|
336
|
+
# [Parameters:]
|
337
|
+
# [document] Document which will be examined for errors.
|
338
|
+
#
|
339
|
+
# [Return:]
|
340
|
+
# String. HTML code for displaying error on edit form.
|
286
341
|
####################################################################
|
287
342
|
def dc_error_messages_for(document)
|
288
343
|
return '' unless document.errors.any?
|
@@ -304,10 +359,23 @@ end
|
|
304
359
|
####################################################################
|
305
360
|
# Checks if any errors exist on document and writes debug log. It can also
|
306
361
|
# crash if requested. This is mostly usefull in development for debuging
|
307
|
-
# model errors
|
362
|
+
# model errors or when saving to multiple collections and where each save must be
|
363
|
+
# checked if succesfull.
|
308
364
|
#
|
309
|
-
#
|
310
|
-
#
|
365
|
+
# [Parameters:]
|
366
|
+
# [Object document] Document var
|
367
|
+
# [Boolean crash] Should crash when errors detected. Default = false.
|
368
|
+
#
|
369
|
+
# [Return:]
|
370
|
+
# String. Documents error message empty string if everything is OK.
|
371
|
+
#
|
372
|
+
# [Example:]
|
373
|
+
# model.save
|
374
|
+
# if (msg = dc_check_model(model) ).size > 0
|
375
|
+
# p msg
|
376
|
+
# error process ......
|
377
|
+
# end
|
378
|
+
#
|
311
379
|
####################################################################
|
312
380
|
def dc_check_model(document, crash=false)
|
313
381
|
return nil unless document.errors.any?
|
@@ -315,18 +383,20 @@ def dc_check_model(document, crash=false)
|
|
315
383
|
document.errors.each do |attribute, errors_array|
|
316
384
|
msg << "#{attribute}: #{errors_array}\n"
|
317
385
|
end
|
318
|
-
logger.debug(msg)
|
386
|
+
logger.debug(msg) if msg.size > 0
|
319
387
|
crash_it if crash
|
320
388
|
msg
|
321
389
|
end
|
322
390
|
|
323
391
|
######################################################################
|
324
|
-
#
|
325
|
-
#
|
326
|
-
#
|
392
|
+
# Call rake task from controller.
|
393
|
+
#
|
394
|
+
# [Parameters:]
|
395
|
+
# [String task] Rake task name
|
396
|
+
# [Hash options] Options that will be send to task as environment variables
|
327
397
|
#
|
328
|
-
#
|
329
|
-
#
|
398
|
+
# [Example:]
|
399
|
+
# dc_call_rake('clear:all', some_parm: some_id)
|
330
400
|
######################################################################
|
331
401
|
def dc_call_rake(task, options = {})
|
332
402
|
options[:rails_env] ||= Rails.env
|
@@ -335,12 +405,22 @@ def dc_call_rake(task, options = {})
|
|
335
405
|
end
|
336
406
|
|
337
407
|
######################################################################
|
338
|
-
# Small helper for
|
339
|
-
#
|
340
|
-
#
|
408
|
+
# Small helper for rendering ajax return code from controller. When ajax call is
|
409
|
+
# made from DRG CMS form return may be quite complicated. All ajax return combinations
|
410
|
+
# can be found in drg_cms.js file.
|
411
|
+
#
|
412
|
+
# [Parameters:]
|
413
|
+
# [Hash opts] Different options
|
414
|
+
#
|
415
|
+
# [Return:]
|
416
|
+
# String. Formatted to be used on ajax return.
|
417
|
+
#
|
418
|
+
# [Example:]
|
419
|
+
# html_code = '<span>Some text</span>'
|
420
|
+
# dc_render_ajax(div: 'mydiv', prepand: html_code) # Will prepand code to mydiv div
|
421
|
+
# dc_render_ajax(class: 'myclass', append: html_code) # Will append code to all objects with myclass class
|
422
|
+
# dc_render_ajax(operation: 'window', value: "/pdf_file.pdf") # will open pdf file in new window.
|
341
423
|
#
|
342
|
-
# @param [ task ] Rake task name
|
343
|
-
# @param [ options ] Options that will be send to task as environment variables
|
344
424
|
######################################################################
|
345
425
|
def dc_render_ajax(opts)
|
346
426
|
result = {}
|
@@ -360,13 +440,19 @@ def dc_render_ajax(opts)
|
|
360
440
|
end
|
361
441
|
|
362
442
|
########################################################################
|
363
|
-
# Find document by parameters
|
364
|
-
#
|
365
|
-
#
|
443
|
+
# Find document by parameters. This is how cmsedit finds document based
|
444
|
+
# on url parameters.
|
445
|
+
#
|
446
|
+
# [Parameters:]
|
447
|
+
# [String table] Table (collection) name. Could be dc_page;dc_part;... when searching for embedded document.
|
448
|
+
# [String id] Id of the document
|
449
|
+
# [String table] Ids of parent documents when document is embedded. Ids are separated by ; char.
|
450
|
+
#
|
451
|
+
# [Return:]
|
452
|
+
# Document. Required document or nil if not found.
|
366
453
|
#
|
367
|
-
#
|
368
|
-
#
|
369
|
-
# @param [ ids ] Ids of parent documents when document is embedded. Ids are separated by ; char.
|
454
|
+
# [Example:]
|
455
|
+
# dc_find_document(params[:table], params[:id], params[:ids])
|
370
456
|
########################################################################
|
371
457
|
def dc_find_document(table, id, ids)
|
372
458
|
tables = table.split(';')
|
@@ -22,11 +22,27 @@
|
|
22
22
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
23
|
#++
|
24
24
|
|
25
|
+
########################################################################
|
26
|
+
# This controller holds some common actions used by CMS.
|
27
|
+
########################################################################
|
25
28
|
class DcCommonController < DcApplicationController
|
26
29
|
layout false
|
27
30
|
|
28
31
|
########################################################################
|
29
|
-
#
|
32
|
+
# This action is called on ajax autocomplete call. It checks if user has rights to
|
33
|
+
# wiev data.
|
34
|
+
#
|
35
|
+
# Url parameters:
|
36
|
+
# [table] Table (collection) model name in lower case indicating table which will be searched.
|
37
|
+
# [id] Name of id key field that will be returend. Default is '_id'
|
38
|
+
# [input] Search data entered in input field.
|
39
|
+
# [search] when passed without dot it defines field name on which search
|
40
|
+
# will be performed. When passed with dot class_method.method_name is assumed. Method name will
|
41
|
+
# be parsed and any class with class method name can be avalueted. Class method must accept
|
42
|
+
# input parameter and return array [ [_id, value],.. ] which will be used in autocomplete field.
|
43
|
+
#
|
44
|
+
# Return:
|
45
|
+
# JSON array [label, value, id] of first 20 documents that confirm to query.
|
30
46
|
########################################################################
|
31
47
|
def autocomplete
|
32
48
|
# return '' unless session[:edit_mode] > 0 #
|
@@ -34,7 +50,7 @@ def autocomplete
|
|
34
50
|
# TODO Double check if previous line works as it should.
|
35
51
|
table = params['table'].classify.constantize
|
36
52
|
id = [params['id']] || '_id'
|
37
|
-
# call method in class if search parameter has . This is for user defined
|
53
|
+
# call method in class if search parameter has . This is for user defined searches
|
38
54
|
# result must be returned as array of [id, search_field_value]
|
39
55
|
a = if params['search'].match(/\./)
|
40
56
|
name, method = params['search'].split('.')
|
@@ -51,13 +67,13 @@ def autocomplete
|
|
51
67
|
end
|
52
68
|
|
53
69
|
########################################################################
|
54
|
-
# Register and
|
70
|
+
# Register and record click when ad link is clicked.
|
55
71
|
########################################################################
|
56
72
|
def ad_click
|
57
73
|
if (ad = DcAd.find(params[:id]))
|
58
74
|
ad.clicked += 1
|
59
75
|
ad.save
|
60
|
-
DcAdStat.create!(dc_ad_id: params[:id], ip: request.ip, type: 2 )
|
76
|
+
DcAdStat.create!(dc_ad_id: params[:id], ip: request.ip, type: 2 )
|
61
77
|
else
|
62
78
|
logger.error "ERROR ADS: Invalid ad id=#{params[:id]} ip=#{request.ip}."
|
63
79
|
end
|
@@ -66,13 +82,14 @@ def ad_click
|
|
66
82
|
end
|
67
83
|
|
68
84
|
##########################################################################
|
69
|
-
# Toggle
|
85
|
+
# Toggle CMS edit mode.This action is called when user clicks CMS option on
|
86
|
+
# top of the browser.
|
70
87
|
##########################################################################
|
71
88
|
def toggle_edit_mode
|
72
89
|
session[:edit_mode] ||= 0
|
73
90
|
# called directly without authorization
|
74
91
|
if session[:edit_mode] < 1
|
75
|
-
dc_render_404
|
92
|
+
dc_render_404
|
76
93
|
else
|
77
94
|
session[:edit_mode] = (session[:edit_mode] == 1) ? 2 : 1
|
78
95
|
redirect_to params[:return_to]
|
@@ -80,15 +97,17 @@ def toggle_edit_mode
|
|
80
97
|
end
|
81
98
|
|
82
99
|
####################################################################
|
83
|
-
#
|
100
|
+
# Default user login action.
|
84
101
|
####################################################################
|
85
102
|
def process_login
|
86
103
|
# Something is really wrong
|
87
104
|
return dc_render_404 unless ( params[:record] and params[:record][:username] and params[:record][:password] )
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
105
|
+
|
106
|
+
if params[:record][:password].to_s.size > 0 #password must not be empty
|
107
|
+
user = DcUser.find_by(username: params[:record][:username])
|
108
|
+
if user and user.authenticate(params[:record][:password])
|
109
|
+
fill_login_data(user, params[:record][:remember_me].to_i == 1)
|
110
|
+
end
|
92
111
|
else
|
93
112
|
flash[:error] = t('drgcms.invalid_username')
|
94
113
|
params[:return_to] = params[:return_to_error] # return_to error
|
@@ -97,7 +116,7 @@ def process_login
|
|
97
116
|
end
|
98
117
|
|
99
118
|
####################################################################
|
100
|
-
#
|
119
|
+
# Default user logout action.
|
101
120
|
####################################################################
|
102
121
|
def logout
|
103
122
|
clear_login_data
|
@@ -105,7 +124,8 @@ def logout
|
|
105
124
|
end
|
106
125
|
|
107
126
|
####################################################################
|
108
|
-
# Alternative login
|
127
|
+
# Alternative login action with remember_me cookie. If found it will automatically
|
128
|
+
# login user otherwise user will be presented with regular login dialog.
|
109
129
|
####################################################################
|
110
130
|
def login
|
111
131
|
if cookies.signed[:remember_me]
|
@@ -126,7 +146,7 @@ def login
|
|
126
146
|
end
|
127
147
|
|
128
148
|
####################################################################
|
129
|
-
#
|
149
|
+
# Action is called when restore document from journal is requested.
|
130
150
|
####################################################################
|
131
151
|
def restore_from_journal
|
132
152
|
# selected fields to hash
|
@@ -161,24 +181,6 @@ def restore_from_journal
|
|
161
181
|
render inline: result.to_json, formats: 'js'
|
162
182
|
end
|
163
183
|
|
164
|
-
########################################################################
|
165
|
-
# Update some anomalies in json
|
166
|
-
########################################################################
|
167
|
-
def update_json(json, is_update=false)
|
168
|
-
result = {}
|
169
|
-
json.each do |k,v|
|
170
|
-
if v.class == Hash
|
171
|
-
result[k] = v['$oid'] if is_update
|
172
|
-
elsif v.class == Array
|
173
|
-
result[k] = []
|
174
|
-
v.each {|e| result[k] << update_json(e, is_update)}
|
175
|
-
else
|
176
|
-
result[k] = v
|
177
|
-
end
|
178
|
-
end
|
179
|
-
result
|
180
|
-
end
|
181
|
-
|
182
184
|
########################################################################
|
183
185
|
# Copy current record to clipboard as json text. It will actually ouput an
|
184
186
|
# window with data formatted as json.
|
@@ -202,6 +204,8 @@ end
|
|
202
204
|
|
203
205
|
########################################################################
|
204
206
|
# Paste data from clipboard into text_area and update documents in destination database.
|
207
|
+
# This action is called twice. First time for displaying text_area field and second time
|
208
|
+
# ajax call for processing data.
|
205
209
|
########################################################################
|
206
210
|
def paste_clipboard
|
207
211
|
# Only administrators can perform this operation
|
@@ -236,6 +240,24 @@ end
|
|
236
240
|
|
237
241
|
protected
|
238
242
|
|
243
|
+
########################################################################
|
244
|
+
# Update some anomalies in json data on paste_clipboard action.
|
245
|
+
########################################################################
|
246
|
+
def update_json(json, is_update=false) #:nodoc:
|
247
|
+
result = {}
|
248
|
+
json.each do |k,v|
|
249
|
+
if v.class == Hash
|
250
|
+
result[k] = v['$oid'] if is_update
|
251
|
+
elsif v.class == Array
|
252
|
+
result[k] = []
|
253
|
+
v.each {|e| result[k] << update_json(e, is_update)}
|
254
|
+
else
|
255
|
+
result[k] = v
|
256
|
+
end
|
257
|
+
end
|
258
|
+
result
|
259
|
+
end
|
260
|
+
|
239
261
|
########################################################################
|
240
262
|
# Processes one document. Subroutine of paste_clipboard.
|
241
263
|
########################################################################
|
@@ -262,7 +284,7 @@ def process_document(line, table, id, ids)
|
|
262
284
|
end
|
263
285
|
|
264
286
|
####################################################################
|
265
|
-
# Clears all session data related to login
|
287
|
+
# Clears all session data related to login.
|
266
288
|
####################################################################
|
267
289
|
def clear_login_data
|
268
290
|
session[:edit_mode] = 0
|
@@ -273,7 +295,7 @@ def clear_login_data
|
|
273
295
|
end
|
274
296
|
|
275
297
|
####################################################################
|
276
|
-
# Fills session with data related to
|
298
|
+
# Fills session with data related to successful login.
|
277
299
|
####################################################################
|
278
300
|
def fill_login_data(user, remember_me)
|
279
301
|
session[:user_id] = user.id
|