drg_cms 0.4.39
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 +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +3 -0
- data/Rakefile +39 -0
- data/app/assets/images/drg_cms/add.png +0 -0
- data/app/assets/images/drg_cms/arrow_in.png +0 -0
- data/app/assets/images/drg_cms/arrow_out.png +0 -0
- data/app/assets/images/drg_cms/checkbox-checked.png +0 -0
- data/app/assets/images/drg_cms/checkbox-unchecked.png +0 -0
- data/app/assets/images/drg_cms/cols.png +0 -0
- data/app/assets/images/drg_cms/copy.png +0 -0
- data/app/assets/images/drg_cms/edit.png +0 -0
- data/app/assets/images/drg_cms/edit_design.png +0 -0
- data/app/assets/images/drg_cms/edit_page.png +0 -0
- data/app/assets/images/drg_cms/edit_site.png +0 -0
- data/app/assets/images/drg_cms/html.png +0 -0
- data/app/assets/images/drg_cms/pin.png +0 -0
- data/app/assets/images/drg_cms/printer.png +0 -0
- data/app/assets/images/drg_cms/reload.png +0 -0
- data/app/assets/images/drg_cms/search_16.png +0 -0
- data/app/assets/images/drg_cms/spinner.gif +0 -0
- data/app/assets/images/drg_cms/view_tile.png +0 -0
- data/app/assets/images/drg_cms/x.png +0 -0
- data/app/assets/javascripts/drg_cms/drg_cms.js +449 -0
- data/app/assets/javascripts/drg_cms/jquery-migrate.js +511 -0
- data/app/assets/javascripts/drg_cms/jquery.datetimepicker.js +1353 -0
- data/app/assets/javascripts/drg_cms/some_scripts.js +33 -0
- data/app/assets/javascripts/drg_cms_application.js +11 -0
- data/app/assets/javascripts/drg_cms_cms.js +28 -0
- data/app/assets/stylesheets/drg_cms/drg_cms.css +632 -0
- data/app/assets/stylesheets/drg_cms/jquery-ui.css +339 -0
- data/app/assets/stylesheets/drg_cms/jquery.datetimepicker.css +304 -0
- data/app/assets/stylesheets/drg_cms/th-bg.png +0 -0
- data/app/assets/stylesheets/drg_cms/theme.css +49 -0
- data/app/assets/stylesheets/drg_cms_application.css +12 -0
- data/app/assets/stylesheets/drg_cms_cms.css +26 -0
- data/app/controllers/cmsedit_controller.rb +673 -0
- data/app/controllers/dc_application_controller.rb +385 -0
- data/app/controllers/dc_at_the_beginning_controller.rb +120 -0
- data/app/controllers/dc_common_controller.rb +314 -0
- data/app/controllers/dc_mail_controller.rb +89 -0
- data/app/controllers/dc_main_controller.rb +40 -0
- data/app/controllers/drgcms_controls/dc_page_controls.rb +40 -0
- data/app/forms/all_options.yml +176 -0
- data/app/forms/cms_forms.yml +93 -0
- data/app/forms/cms_menu.yml +142 -0
- data/app/forms/dc_ad.yml +130 -0
- data/app/forms/dc_big_table.yml +59 -0
- data/app/forms/dc_big_table_locale.yml +41 -0
- data/app/forms/dc_big_table_value.yml +47 -0
- data/app/forms/dc_category.yml +57 -0
- data/app/forms/dc_design.yml +68 -0
- data/app/forms/dc_folder_permission.yml +49 -0
- data/app/forms/dc_forum_cat.yml +54 -0
- data/app/forms/dc_forum_forum.yml +53 -0
- data/app/forms/dc_forum_msg.yml +124 -0
- data/app/forms/dc_forum_privmsg.yml +125 -0
- data/app/forms/dc_forum_topic.yml +131 -0
- data/app/forms/dc_journal.yml +85 -0
- data/app/forms/dc_link.yml +55 -0
- data/app/forms/dc_mail.yml +88 -0
- data/app/forms/dc_mail_address.yml +56 -0
- data/app/forms/dc_mail_list.yml +44 -0
- data/app/forms/dc_mail_list_member.yml +42 -0
- data/app/forms/dc_menu.yml +62 -0
- data/app/forms/dc_menu_item.yml +81 -0
- data/app/forms/dc_page.yml +145 -0
- data/app/forms/dc_part.yml +102 -0
- data/app/forms/dc_permission.yml +50 -0
- data/app/forms/dc_piece.yml +105 -0
- data/app/forms/dc_policy.yml +57 -0
- data/app/forms/dc_policy_role.yml +42 -0
- data/app/forms/dc_policy_rule.yml +38 -0
- data/app/forms/dc_policy_rule_nocms.yml +38 -0
- data/app/forms/dc_poll.yml +113 -0
- data/app/forms/dc_poll_item.yml +76 -0
- data/app/forms/dc_simple_menu.yml +64 -0
- data/app/forms/dc_simple_menu_item.yml +80 -0
- data/app/forms/dc_site.yml +149 -0
- data/app/forms/dc_user.yml +142 -0
- data/app/forms/dc_user_role.yml +54 -0
- data/app/forms/drgcms_cms.yml +28 -0
- data/app/helpers/cmsedit_helper.rb +698 -0
- data/app/helpers/dc_ad_renderer.rb +206 -0
- data/app/helpers/dc_application_helper.rb +704 -0
- data/app/helpers/dc_big_menu_renderer.rb +180 -0
- data/app/helpers/dc_captcha_renderer.rb +100 -0
- data/app/helpers/dc_common_renderer.rb +132 -0
- data/app/helpers/dc_mail_renderer.rb +76 -0
- data/app/helpers/dc_menu_renderer.rb +143 -0
- data/app/helpers/dc_page_renderer.rb +80 -0
- data/app/helpers/dc_part_renderer.rb +162 -0
- data/app/helpers/dc_piece_renderer.rb +124 -0
- data/app/helpers/dc_poll_renderer.rb +219 -0
- data/app/helpers/dc_renderer.rb +56 -0
- data/app/helpers/dc_simple_menu_renderer.rb +244 -0
- data/app/helpers/drgcms_form_field.rb +863 -0
- data/app/models/__dc_global_data.rb +44 -0
- data/app/models/dc_ad.rb +52 -0
- data/app/models/dc_ad_stat.rb +34 -0
- data/app/models/dc_big_menu.rb +89 -0
- data/app/models/dc_big_table.rb +63 -0
- data/app/models/dc_big_table_locale.rb +35 -0
- data/app/models/dc_big_table_value.rb +38 -0
- data/app/models/dc_category.rb +48 -0
- data/app/models/dc_design.rb +48 -0
- data/app/models/dc_dummy.rb +30 -0
- data/app/models/dc_folder_permission.rb +43 -0
- data/app/models/dc_global_data.rb +44 -0
- data/app/models/dc_journal.rb +39 -0
- data/app/models/dc_key_value_store.rb +90 -0
- data/app/models/dc_link.rb +39 -0
- data/app/models/dc_mail.rb +64 -0
- data/app/models/dc_mail_address.rb +69 -0
- data/app/models/dc_mail_list.rb +48 -0
- data/app/models/dc_mail_list_member.rb +34 -0
- data/app/models/dc_menu.rb +59 -0
- data/app/models/dc_menu_item.rb +40 -0
- data/app/models/dc_page.rb +123 -0
- data/app/models/dc_part.rb +28 -0
- data/app/models/dc_permission.rb +58 -0
- data/app/models/dc_piece.rb +57 -0
- data/app/models/dc_policy.rb +94 -0
- data/app/models/dc_policy_role.rb +47 -0
- data/app/models/dc_policy_rule.rb +65 -0
- data/app/models/dc_poll.rb +46 -0
- data/app/models/dc_poll_item.rb +40 -0
- data/app/models/dc_sendmail.rb +48 -0
- data/app/models/dc_simple_menu.rb +58 -0
- data/app/models/dc_simple_menu_item.rb +39 -0
- data/app/models/dc_site.rb +92 -0
- data/app/models/dc_stat.rb +36 -0
- data/app/models/dc_user.rb +91 -0
- data/app/models/dc_user_role.rb +36 -0
- data/app/models/dc_visit.rb +35 -0
- data/app/views/cmsedit/_edit_stuff.html.erb +59 -0
- data/app/views/cmsedit/_edit_stuff.js.erb +6 -0
- data/app/views/cmsedit/_form.html.erb +21 -0
- data/app/views/cmsedit/_result.html.erb +20 -0
- data/app/views/cmsedit/edit.html.erb +6 -0
- data/app/views/cmsedit/error.html.erb +2 -0
- data/app/views/cmsedit/index.html.erb +6 -0
- data/app/views/cmsedit/new.html.erb +5 -0
- data/app/views/cmsedit/show.html.erb +21 -0
- 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/dc_common/paste_clipboard.html.erb +17 -0
- data/app/views/dc_mail/subscribe.html.erb +7 -0
- data/app/views/dc_mail/unsubscribe.html.erb +19 -0
- data/app/views/layouts/cms.html.erb +17 -0
- data/app/views/layouts/cmsedit.html.erb +16 -0
- data/app/views/layouts/content.html.erb +16 -0
- data/config/initializers/kaminari_patch.rb +36 -0
- data/config/locales/datetimepicker.yml +13 -0
- data/config/locales/drgcms_en.yml +96 -0
- data/config/locales/drgcms_sl.yml +97 -0
- data/config/locales/en.yml +7 -0
- data/config/locales/kaminari.yml +26 -0
- data/config/locales/models_en.yml +790 -0
- data/config/locales/models_sl.yml +805 -0
- data/config/locales/mongoid_sl.yml +60 -0
- data/config/locales/sl.yml +211 -0
- data/config/routes.rb +2 -0
- data/drg_cms.gemspec +28 -0
- data/lib/drg_cms.rb +45 -0
- data/lib/drg_cms/engine.rb +30 -0
- data/lib/drg_cms/version.rb +3 -0
- data/lib/tasks/at_the_beginning.yml +26 -0
- data/lib/tasks/dc_cleanup.rake +94 -0
- data/lib/tasks/drg_cms_tasks.rake +118 -0
- data/lib/tasks/send_mail.rake +253 -0
- data/lib/tasks/site_statistics.rake +80 -0
- data/test/drg_cms_test.rb +7 -0
- data/test/dummy/README.rdoc +261 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +15 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +59 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +37 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +58 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +25 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/integration/navigation_test.rb +10 -0
- data/test/test_helper.rb +15 -0
- metadata +375 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Copyright (c) 2012-2013 Damjan Rems
|
|
3
|
+
#
|
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
|
5
|
+
# a copy of this software and associated documentation files (the
|
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
|
10
|
+
# the following conditions:
|
|
11
|
+
#
|
|
12
|
+
# The above copyright notice and this permission notice shall be
|
|
13
|
+
# included in all copies or substantial portions of the Software.
|
|
14
|
+
#
|
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUTe NOT LIMITED TO THE WARRANTIES OF
|
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
|
+
#++
|
|
23
|
+
|
|
24
|
+
########################################################################
|
|
25
|
+
#
|
|
26
|
+
########################################################################
|
|
27
|
+
class DcAdRenderer
|
|
28
|
+
|
|
29
|
+
include DcApplicationHelper
|
|
30
|
+
|
|
31
|
+
########################################################################
|
|
32
|
+
#
|
|
33
|
+
########################################################################
|
|
34
|
+
def initialize( parent, opts={} )
|
|
35
|
+
@parent = parent
|
|
36
|
+
@opts = opts
|
|
37
|
+
@css = ''
|
|
38
|
+
self
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
########################################################################
|
|
42
|
+
#
|
|
43
|
+
########################################################################
|
|
44
|
+
def find_ads_multi()
|
|
45
|
+
ads = DcAd.where( position: @opts[:position], active: true).to_a#, :valid_to.gt => Time.now, :valid_from.lt => Time.now).to_a
|
|
46
|
+
#p @opts, ads.size, '*-*-*-*'
|
|
47
|
+
ads.delete_if { |ad| (ad.valid_to and ad.valid_to < Time.now) or
|
|
48
|
+
(ad.valid_from and ad.valid_from > Time.now) or
|
|
49
|
+
(ad.displays > 0 and ad.displayed >= ad.displays) or
|
|
50
|
+
(ad.clicks > 0 and ad.clicked >= ad.clicks) }
|
|
51
|
+
|
|
52
|
+
ads
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
########################################################################
|
|
56
|
+
# Default method for rendering ads
|
|
57
|
+
########################################################################
|
|
58
|
+
def multi
|
|
59
|
+
return '' if @parent.session[:is_robot] # don't bother if robot
|
|
60
|
+
html = "<div id='ad-#{@opts[:position]}-div'>"
|
|
61
|
+
n = 0
|
|
62
|
+
find_ads_multi.each do |ad|
|
|
63
|
+
div = "ad-#{@opts[:position]}-#{n+=1}"
|
|
64
|
+
html << "<div id='#{div}' style='position: absolute; display: none;'>"
|
|
65
|
+
# all except first are hidden
|
|
66
|
+
# html << n == 1 ? '>' : 'style="display: none;">'
|
|
67
|
+
html << case ad.type
|
|
68
|
+
when 1 then # picture
|
|
69
|
+
picture_link ad
|
|
70
|
+
when 2 then # flash
|
|
71
|
+
flash_link ad
|
|
72
|
+
when 3 then # script
|
|
73
|
+
ad.script
|
|
74
|
+
else
|
|
75
|
+
'Error. Wrong ad type!'
|
|
76
|
+
end
|
|
77
|
+
html << '</div>'
|
|
78
|
+
end
|
|
79
|
+
#
|
|
80
|
+
html << '</div>'
|
|
81
|
+
if n > 0
|
|
82
|
+
js = <<EOJS
|
|
83
|
+
dc_ad_next_slide = function(div, index, max, timeout) {
|
|
84
|
+
index = index + 1;
|
|
85
|
+
div_show = div + index.toString();
|
|
86
|
+
index_h = index - 1;
|
|
87
|
+
if (index_h == 0) index_h = max;
|
|
88
|
+
div_hide = div + index_h.toString();
|
|
89
|
+
$('#' + div_show).fadeIn(1500);
|
|
90
|
+
$('#' + div_hide).fadeOut(1500);
|
|
91
|
+
|
|
92
|
+
if (index == max) index = 0;
|
|
93
|
+
setTimeout( function () { dc_ad_next_slide(div, index, max, timeout); }, timeout);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
$(document).ready(function () {
|
|
97
|
+
dc_ad_next_slide("ad-#{@opts[:position]}-", 0, #{n}, 5000)
|
|
98
|
+
});
|
|
99
|
+
EOJS
|
|
100
|
+
html << @parent.javascript_tag(js)
|
|
101
|
+
end
|
|
102
|
+
html
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
########################################################################
|
|
106
|
+
#
|
|
107
|
+
########################################################################
|
|
108
|
+
def find_ad_to_display()
|
|
109
|
+
ads = DcAd.where( dc_site_id: @parent.site._id, position: @opts[:position], active: true).to_a#, :valid_to.gt => Time.now, :valid_from.lt => Time.now).to_a
|
|
110
|
+
#p @opts, ads.size, '*-*-*-*'
|
|
111
|
+
ads.delete_if { |ad| (ad.valid_to and ad.valid_to < Time.now) or
|
|
112
|
+
(ad.valid_from and ad.valid_from > Time.now) or
|
|
113
|
+
(ad.displays > 0 and ad.displayed >= ad.displays) or
|
|
114
|
+
(ad.clicks > 0 and ad.clicked >= ad.clicks) }
|
|
115
|
+
return nil if ads.size == 0
|
|
116
|
+
# Determine ad to display, based on priority. This is of course not totaly accurate,
|
|
117
|
+
# but it will have to do.
|
|
118
|
+
sum = ads.inject(0) {|r, e| r += e.priority}
|
|
119
|
+
rnd = Random.rand(sum)
|
|
120
|
+
r = 0
|
|
121
|
+
ads.each do |e|
|
|
122
|
+
return e if rnd >= r and rnd < r + e.priority
|
|
123
|
+
r += e.priority
|
|
124
|
+
end
|
|
125
|
+
ads.last # we really shouldn't be here
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
########################################################################
|
|
129
|
+
# Create flash link for ad
|
|
130
|
+
########################################################################
|
|
131
|
+
def flash_link(ad)
|
|
132
|
+
click_tag = ad.link.to_s.size > 5 ? "flashvars=\"clickTag=#{ad.link}\"" : ''
|
|
133
|
+
<<EOT
|
|
134
|
+
<div class="link_to_track" id="#{ad.id}">
|
|
135
|
+
<object>
|
|
136
|
+
<param name="wmode" value="transparent" />
|
|
137
|
+
<embed width="#{ad.width}" height="#{ad.height}" src="#{ad.file}" #{click_tag}
|
|
138
|
+
wmode=transparent allowfullscreen='true' allowscriptaccess='always' type="application/x-shockwave-flash"></embed>
|
|
139
|
+
</object>
|
|
140
|
+
</div>
|
|
141
|
+
|
|
142
|
+
<script type='text/javascript'>
|
|
143
|
+
$('##{ad.id}').mousedown(function (e){
|
|
144
|
+
$.post('/dc_common/ad_click', { id: this.id });
|
|
145
|
+
return true;
|
|
146
|
+
});
|
|
147
|
+
</script>
|
|
148
|
+
EOT
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
########################################################################
|
|
152
|
+
# Create picture link for ad
|
|
153
|
+
########################################################################
|
|
154
|
+
def picture_link(ad)
|
|
155
|
+
@parent.link_to @parent.image_tag(ad.file), ad.link, id: ad.id, class: 'link_to_track', target: ad.link_target
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
########################################################################
|
|
159
|
+
# Default method for rendering ads
|
|
160
|
+
########################################################################
|
|
161
|
+
def default
|
|
162
|
+
return '' if @parent.session[:is_robot] # don't bother if robot
|
|
163
|
+
html = ''
|
|
164
|
+
if (ad = find_ad_to_display)
|
|
165
|
+
# save to statistics, if not in cms
|
|
166
|
+
if @opts[:edit_mode] < 1
|
|
167
|
+
DcAdStat.create!(dc_ad_id: ad.id, ip: @parent.request.ip, type: 1 )
|
|
168
|
+
# save display counter
|
|
169
|
+
ad.displayed += 1
|
|
170
|
+
ad.save
|
|
171
|
+
end
|
|
172
|
+
html << case ad.type
|
|
173
|
+
when 1 then # picture
|
|
174
|
+
picture_link ad
|
|
175
|
+
when 2 then # flash
|
|
176
|
+
flash_link ad
|
|
177
|
+
when 3 then # script
|
|
178
|
+
ad.script
|
|
179
|
+
else
|
|
180
|
+
'Error. Wrong ad type!'
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
html
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
########################################################################
|
|
187
|
+
# Render HTML
|
|
188
|
+
########################################################################
|
|
189
|
+
def render_html
|
|
190
|
+
method = @opts[:method] || 'default'
|
|
191
|
+
html = if method and self.respond_to?(method)
|
|
192
|
+
send(method)
|
|
193
|
+
else
|
|
194
|
+
"DcAdRenderer: method #{method} not defined!"
|
|
195
|
+
end
|
|
196
|
+
html
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
########################################################################
|
|
200
|
+
# Render CSS
|
|
201
|
+
########################################################################
|
|
202
|
+
def render_css
|
|
203
|
+
@css
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
end
|
|
@@ -0,0 +1,704 @@
|
|
|
1
|
+
#coding: utf-8
|
|
2
|
+
#--
|
|
3
|
+
# Copyright (c) 2012+ Damjan Rems
|
|
4
|
+
#
|
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
|
6
|
+
# a copy of this software and associated documentation files (the
|
|
7
|
+
# "Software"), to deal in the Software without restriction, including
|
|
8
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
|
9
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
|
10
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
|
11
|
+
# the following conditions:
|
|
12
|
+
#
|
|
13
|
+
# The above copyright notice and this permission notice shall be
|
|
14
|
+
# included in all copies or substantial portions of the Software.
|
|
15
|
+
#
|
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
20
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
23
|
+
#++
|
|
24
|
+
|
|
25
|
+
module DcApplicationHelper
|
|
26
|
+
attr_reader :page, :design, :site, :tables, :ids, :form, :options
|
|
27
|
+
attr_accessor :parts
|
|
28
|
+
|
|
29
|
+
############################################################################
|
|
30
|
+
# Calls part renderer to return part of design.
|
|
31
|
+
############################################################################
|
|
32
|
+
def dc_render(renderer, opts={})
|
|
33
|
+
type = renderer.to_s.downcase
|
|
34
|
+
opts[:edit_mode] = session[:edit_mode]
|
|
35
|
+
# TODO Check why did I always put return_to into link and will this break something
|
|
36
|
+
# opts[:editparams] = { return_to: request.url }
|
|
37
|
+
opts[:editparams] = {}
|
|
38
|
+
opts = @options.merge(opts) # merge options with parameters passed on site, page, design ...
|
|
39
|
+
opts.symbolize_keys! # this makes lots of things easier
|
|
40
|
+
# Create renderer object
|
|
41
|
+
klass = (type + '_renderer').classify
|
|
42
|
+
obj = Kernel.const_get(klass, Class.new).new(self, opts)
|
|
43
|
+
#
|
|
44
|
+
html = obj.render_html
|
|
45
|
+
@css << obj.render_css.to_s
|
|
46
|
+
html.nil? ? '' : html.html_safe # nil can happened
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
########################################################################
|
|
50
|
+
# Used for designs with lots of common code and one part which is different.
|
|
51
|
+
#
|
|
52
|
+
# Example: As used in design. Backslashing < and % is important \<\%
|
|
53
|
+
# <% part = "<div class='some-class'>\<\%= dc_render(:my_renderer, method: 'render_method') \%\></div>" %>
|
|
54
|
+
# <%= dc_replace_in_design(piece: 'piece_name', replace: '[main]', with: part) %>
|
|
55
|
+
#
|
|
56
|
+
# Want to replace more than one part. Use array.
|
|
57
|
+
# <%= dc_replace_in_design(replace: ['[part1]','[part2]'], with: [part1, part2]) %>
|
|
58
|
+
#
|
|
59
|
+
# This helper is replacement for 'script' method defined in dc_piece_renderer,
|
|
60
|
+
# but it can also use design defined in site document if piece parameter is not set.
|
|
61
|
+
########################################################################
|
|
62
|
+
def dc_replace_in_design(opts={})
|
|
63
|
+
design = opts[:piece] ? DcPiece.find(name: opts[:piece]).script : dc_get_site.design
|
|
64
|
+
if opts[:replace]
|
|
65
|
+
# replace more than one part of code
|
|
66
|
+
if opts[:replace].class == Array
|
|
67
|
+
0.upto(opts[:replace].size - 1) {|i| design.sub!(opts[:replace][i], opts[:with][i])}
|
|
68
|
+
else
|
|
69
|
+
design.sub!(opts[:replace], opts[:with])
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
render(inline: design, layout: opts[:layout])
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
########################################################################
|
|
76
|
+
########################################################################
|
|
77
|
+
def dc_render_design(opts={}) #NODOC
|
|
78
|
+
p "dc_render_design will be deprecated. Use dc_replace_in_design instead."
|
|
79
|
+
dc_replace_in_design(opts)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
############################################################################
|
|
83
|
+
# Creates title for dialog. Title also has pagination link on its right side.
|
|
84
|
+
############################################################################
|
|
85
|
+
def dc_table_title(text, result=nil)
|
|
86
|
+
c = "<table width='100%' cellspacing='0' cellpadding='1' class='dc-title'><tr><td>#{text}</td>"
|
|
87
|
+
if result and result.respond_to?(:current_page)
|
|
88
|
+
c << "<td align='right' style='font-size: 0.8em;'> #{paginate(result, :params => {:action => 'index'})}</td>"
|
|
89
|
+
end
|
|
90
|
+
c << '<tr></table>'
|
|
91
|
+
c.html_safe
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
############################################################################
|
|
95
|
+
# Creates title for cmsedit edit dialog.
|
|
96
|
+
############################################################################
|
|
97
|
+
def dc_edit_title()
|
|
98
|
+
c = "#{t('drgcms.edit')} : "
|
|
99
|
+
c << (@form['title'] ? t( @form['title'], @form['title'] ) : t_tablename(@form['table'])) + ' : '
|
|
100
|
+
title = @form['form']['edit_title'] || @form['edit_title'] # edit_title bo šel ven
|
|
101
|
+
c << "#{@record[ title ]} : " if title and @record.respond_to?(title)
|
|
102
|
+
c << @record._id
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
############################################################################
|
|
106
|
+
# Creates title for cmsedit new dialog.
|
|
107
|
+
############################################################################
|
|
108
|
+
def dc_new_title()
|
|
109
|
+
if @form['table'] == 'dc_dummy'
|
|
110
|
+
t( @form['title'], @form['title'] )
|
|
111
|
+
else
|
|
112
|
+
"#{t('drgcms.new')} : #{t_tablename(@form['table'])}"
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
####################################################################
|
|
117
|
+
# Creates label for edit dialog.
|
|
118
|
+
####################################################################
|
|
119
|
+
def dc_label_for(input_html, label)
|
|
120
|
+
c =<<eot
|
|
121
|
+
<tr>
|
|
122
|
+
<td class="dc-edit-label">#{label}</td>
|
|
123
|
+
<td class="dc-edit-field">#{input_html}</td>
|
|
124
|
+
</tr>
|
|
125
|
+
eot
|
|
126
|
+
c.html_safe
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
####################################################################
|
|
130
|
+
# Returns messages saved in flash formated for display.
|
|
131
|
+
####################################################################
|
|
132
|
+
def dc_flash_messages()
|
|
133
|
+
err = @parent ? @parent.flash[:error] : flash[:error]
|
|
134
|
+
war = @parent ? @parent.flash[:warning] : flash[:warning]
|
|
135
|
+
inf = @parent ? @parent.flash[:info] : flash[:info]
|
|
136
|
+
note = @parent ? @parent.flash[:note] : flash[:note]
|
|
137
|
+
unless err.nil? and war.nil? and inf.nil? and note.nil?
|
|
138
|
+
c = ''
|
|
139
|
+
c << "<div class=\"dc-form-error\">#{err}</div>" if err
|
|
140
|
+
c << "<div class=\"dc-form-warning\">#{war}</div>" if war
|
|
141
|
+
c << "<div class=\"dc-form-info\">#{inf}</div>" if inf
|
|
142
|
+
c << note if note
|
|
143
|
+
if @parent
|
|
144
|
+
@parent.flash[:error] = nil
|
|
145
|
+
@parent.flash[:warning] = nil
|
|
146
|
+
@parent.flash[:info] = nil
|
|
147
|
+
@parent.flash[:note] = nil
|
|
148
|
+
else
|
|
149
|
+
flash[:error] = nil
|
|
150
|
+
flash[:warning] = nil
|
|
151
|
+
flash[:info] = nil
|
|
152
|
+
flash[:note] = nil
|
|
153
|
+
end
|
|
154
|
+
c.html_safe
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
########################################################################
|
|
159
|
+
# Decamelizes string. This probably doesn't work very good with non ascii chars.
|
|
160
|
+
# Therefore it is very unwise to use non ascii chars for table (collection) names.
|
|
161
|
+
########################################################################
|
|
162
|
+
def decamelize_type(st)
|
|
163
|
+
return nil if st.nil?
|
|
164
|
+
r = ''
|
|
165
|
+
st.to_s.each_char do |c|
|
|
166
|
+
r << case
|
|
167
|
+
when r.size == 0 then c.downcase
|
|
168
|
+
when c.downcase != c then '_' + c.downcase
|
|
169
|
+
else c
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
r
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
####################################################################
|
|
176
|
+
# return error messages for the record
|
|
177
|
+
####################################################################
|
|
178
|
+
def dc_error_messages_for(r)
|
|
179
|
+
return '' unless r.errors.any?
|
|
180
|
+
msgs = ''
|
|
181
|
+
r.errors.each do |attribute, errors_array|
|
|
182
|
+
label = t("helpers.label.#{decamelize_type(r.class)}.#{attribute}", attribute)
|
|
183
|
+
msgs << "<li>#{label} : #{errors_array}</li>"
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
c = <<eot
|
|
187
|
+
<div class="dc-form-error">
|
|
188
|
+
<h2>#{t('drgcms.errors_no')} #{r.errors.size}</h2>
|
|
189
|
+
<ul>#{msgs}</ul>
|
|
190
|
+
</div>
|
|
191
|
+
eot
|
|
192
|
+
c.html_safe
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
####################################################################
|
|
196
|
+
# return true if in edit mode
|
|
197
|
+
####################################################################
|
|
198
|
+
def dc_edit_mode?
|
|
199
|
+
(@parent ? @parent.session[:edit_mode] : session[:edit_mode]) > 1
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
####################################################################
|
|
203
|
+
# Return create link for drg_cms
|
|
204
|
+
####################################################################
|
|
205
|
+
def dc_link_for_create(opts)
|
|
206
|
+
title = opts.delete(:title) #
|
|
207
|
+
target = opts.delete(:target) || 'iframe_cms'
|
|
208
|
+
opts[:action] = 'new'
|
|
209
|
+
url = @parent ? @parent.url_for(opts) : url_for(opts)
|
|
210
|
+
js = "$('##{target}').attr('src', '#{url}'); return false;"
|
|
211
|
+
html = if @parent
|
|
212
|
+
@parent.image_tag('drg_cms/add.png', { onclick: js, style: 'cursor: pointer;', title: title, alt: 'Create'})
|
|
213
|
+
else
|
|
214
|
+
image_tag('drg_cms/add.png', { onclick: js, style: 'cursor: pointer;', title: title, alt: 'Create'})
|
|
215
|
+
end
|
|
216
|
+
html.html_safe
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
####################################################################
|
|
220
|
+
#
|
|
221
|
+
####################################################################
|
|
222
|
+
def dc_link_for_edit(opts)
|
|
223
|
+
title = opts.delete(:title) #
|
|
224
|
+
target = opts.delete(:target) || 'iframe_cms'
|
|
225
|
+
opts[:action] = 'edit'
|
|
226
|
+
opts[:controller] ||= 'cmsedit'
|
|
227
|
+
url = @parent ? @parent.url_for(opts) : url_for(opts)
|
|
228
|
+
js = "$('##{target}').attr('src', '#{url}'); return false;"
|
|
229
|
+
html = if @parent
|
|
230
|
+
@parent.image_tag('drg_cms/edit.png', { onclick: js, style: 'cursor: pointer;', title: title, alt: 'Edit'})
|
|
231
|
+
else
|
|
232
|
+
image_tag('drg_cms/edit.png', { onclick: js, style: 'cursor: pointer;', title: title, alt: 'Edit'})
|
|
233
|
+
end
|
|
234
|
+
html.html_safe
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
####################################################################
|
|
238
|
+
# Create edit link for drg_cms
|
|
239
|
+
####################################################################
|
|
240
|
+
def dc_link_menu_tag(title)
|
|
241
|
+
html =<<EOT
|
|
242
|
+
<dl>
|
|
243
|
+
<dt><div class='drgcms_popmenu' href="#"><span><img style="cursor:pointer;" src="/assets/drg_cms/edit.png" title="#{title}"></span></div></dt>
|
|
244
|
+
<dd>
|
|
245
|
+
<ul class=' div-hidden drgcms_popmenu_class'>
|
|
246
|
+
EOT
|
|
247
|
+
yield html
|
|
248
|
+
html << "</ul></dd></dl>"
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
####################################################################
|
|
252
|
+
# Create one option in page edit link
|
|
253
|
+
####################################################################
|
|
254
|
+
def dc_link_for_edit1(opts, link_text) #NODOC
|
|
255
|
+
url = @parent.url_for(opts)
|
|
256
|
+
"<li><div class='drgcms_popmenu_item' style='cursor: pointer;' data-url='#{url}'>#{link_text}</div></li>\n"
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
########################################################################
|
|
260
|
+
# Create edit menu for dc_page document.
|
|
261
|
+
########################################################################
|
|
262
|
+
def dc_page_edit_menu()
|
|
263
|
+
return '' if @opts[:edit_mode] < 2
|
|
264
|
+
# save some data to cookie. This can not go to session.
|
|
265
|
+
t = @parent.site.page_table
|
|
266
|
+
kukis = { "#{t}.dc_design_id" => @page.dc_design_id,
|
|
267
|
+
"#{t}.menu_id" => @page.menu_id,
|
|
268
|
+
"#{t}.kats" => @page.kats,
|
|
269
|
+
"#{t}.page_id" => @page.id,
|
|
270
|
+
"#{t}.dc_site_id" => @parent.site.id
|
|
271
|
+
}
|
|
272
|
+
@parent.cookies[:record] = Marshal.dump(kukis)
|
|
273
|
+
title = "#{t('drgcms.edit')}: #{@page.subject}"
|
|
274
|
+
dc_link_menu_tag(title) do |html|
|
|
275
|
+
@opts[:editparams].merge!( :controller => 'cmsedit', :action => 'edit' )
|
|
276
|
+
@opts[:editparams].merge!( :id => @page.id, :table => @parent.site.page_table, formname: nil, edit_only: 'body' )
|
|
277
|
+
html << dc_link_for_edit1( @opts[:editparams], t('drgcms.edit_content') )
|
|
278
|
+
|
|
279
|
+
@opts[:editparams][:edit_only] = nil
|
|
280
|
+
html << dc_link_for_edit1( @opts[:editparams], t('drgcms.edit_advanced') )
|
|
281
|
+
|
|
282
|
+
@opts[:editparams][:action] = 'new'
|
|
283
|
+
html << dc_link_for_edit1( @opts[:editparams], t('drgcms.edit_new_page') )
|
|
284
|
+
|
|
285
|
+
@opts[:editparams].merge!(ids: @page.id, formname: 'dc_part', table: "#{@parent.site.page_table};dc_part" )
|
|
286
|
+
html << dc_link_for_edit1( @opts[:editparams], t('drgcms.edit_new_part') )
|
|
287
|
+
end
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
########################################################################
|
|
291
|
+
# Return page class (from site record) which defines page_class table (collection)
|
|
292
|
+
# used for saving page data.
|
|
293
|
+
#
|
|
294
|
+
# Mostly used by forms, when some method must be called from page model.
|
|
295
|
+
#
|
|
296
|
+
# @example usage from form description:
|
|
297
|
+
# 30:
|
|
298
|
+
# name: link
|
|
299
|
+
# type: text_with_select
|
|
300
|
+
# eval: 'DcPageClass.all_pages_for_site(@parent.dc_get_site)'
|
|
301
|
+
########################################################################
|
|
302
|
+
def dc_page_class()
|
|
303
|
+
dc_get_site.page_class.classify.constantize
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
####################################################################
|
|
307
|
+
# Wrapper for i18 t method, with some spice added
|
|
308
|
+
####################################################################
|
|
309
|
+
def t(key, default='')
|
|
310
|
+
c = I18n.t(key)
|
|
311
|
+
if c.class == Hash or c.match( 'translation missing' )
|
|
312
|
+
c = I18n.t(key, locale: 'en')
|
|
313
|
+
# Still not found. Return default if set
|
|
314
|
+
c = default unless default.blank?
|
|
315
|
+
end
|
|
316
|
+
c
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
####################################################################
|
|
320
|
+
# Returns translated tablename.
|
|
321
|
+
####################################################################
|
|
322
|
+
def t_tablename(tablename, default=nil)
|
|
323
|
+
t('helpers.label.' + tablename + '.tabletitle', default || tablename)
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
############################################################################
|
|
327
|
+
# Translation for field name label.
|
|
328
|
+
############################################################################
|
|
329
|
+
def t_name(name, default='')
|
|
330
|
+
c = t("helpers.label.#{@form['table']}.#{name}", default)
|
|
331
|
+
c = name.capitalize.gsub('_',' ') if c.match( 'translation missing' )
|
|
332
|
+
c
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
############################################################################
|
|
336
|
+
# Return name (description) for specified field in document
|
|
337
|
+
#
|
|
338
|
+
# @example usage from program
|
|
339
|
+
# dc_name4_value('dc_user', 'name', text.id)
|
|
340
|
+
#
|
|
341
|
+
# @example usage from form description
|
|
342
|
+
# columns:
|
|
343
|
+
# 2:
|
|
344
|
+
# name: site_id
|
|
345
|
+
# eval: dc_name4_value('site','name',@record['site_id'])
|
|
346
|
+
#
|
|
347
|
+
# @param [ model ] table (collection) model name.
|
|
348
|
+
# @param [ field ] field name to return
|
|
349
|
+
# @param [ id ] id to search for
|
|
350
|
+
#
|
|
351
|
+
############################################################################
|
|
352
|
+
def dc_name4_value(model, field, value)
|
|
353
|
+
return '' if value.nil?
|
|
354
|
+
c = t('helpers.label.' + model + '.choices4_' + field )
|
|
355
|
+
a = c.chomp.split(',').inject([]) {|r,v| r << v.split(':') }
|
|
356
|
+
a.each {|e| return e.first if e.last.to_s == value.to_s }
|
|
357
|
+
''
|
|
358
|
+
end
|
|
359
|
+
|
|
360
|
+
############################################################################
|
|
361
|
+
# Return name (description) for specified table and id
|
|
362
|
+
#
|
|
363
|
+
# @example usage from program
|
|
364
|
+
# dc_name4_id('dc_user', 'name', text.id)
|
|
365
|
+
#
|
|
366
|
+
# @example usage from form description
|
|
367
|
+
# columns:
|
|
368
|
+
# 2:
|
|
369
|
+
# name: site_id
|
|
370
|
+
# eval: name4_id('site','name',@record['site_id'])
|
|
371
|
+
#
|
|
372
|
+
# @param [ model ] table (collection) model name.
|
|
373
|
+
# @param [ field ] field name to return
|
|
374
|
+
# @param [ id ] id to search for
|
|
375
|
+
#
|
|
376
|
+
############################################################################
|
|
377
|
+
def dc_name4_id(model, field, id)
|
|
378
|
+
return '' if id.nil?
|
|
379
|
+
model = model.classify.constantize if model.class == String
|
|
380
|
+
rec = model.find_by(id: id)
|
|
381
|
+
rec.nil? ? '' : rec[field]
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
############################################################################
|
|
385
|
+
# Return icon representation for boolean value. Icon is a picture of checked or unchecked box.
|
|
386
|
+
#
|
|
387
|
+
# @example usage from program
|
|
388
|
+
# dc_icon4_boolean(some_value)
|
|
389
|
+
#
|
|
390
|
+
# @example usage from form description
|
|
391
|
+
# columns:
|
|
392
|
+
# 10:
|
|
393
|
+
# name: active
|
|
394
|
+
# eval: dc_icon4_boolean
|
|
395
|
+
#
|
|
396
|
+
# @param [ value ] value
|
|
397
|
+
############################################################################
|
|
398
|
+
def dc_icon4_boolean(val)
|
|
399
|
+
dc_dont?(val) ? image_tag('drg_cms/checkbox-unchecked.png') : image_tag('drg_cms/checkbox-checked.png')
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
############################################################################
|
|
403
|
+
# Safely output date/time value in desired format. Will return '' if value is nil.
|
|
404
|
+
#
|
|
405
|
+
# Mostly used for calling from views.
|
|
406
|
+
############################################################################
|
|
407
|
+
def dc_date_time(val, default=nil)
|
|
408
|
+
return '' if val.nil?
|
|
409
|
+
default = ( val.class == Date ? t('date.formats.default') : t('time.formats.default') ) if default.nil?
|
|
410
|
+
val.strftime(default)
|
|
411
|
+
end
|
|
412
|
+
|
|
413
|
+
####################################################################
|
|
414
|
+
# Determine and return site record from url. Site record will be cached in
|
|
415
|
+
# @site variable.
|
|
416
|
+
####################################################################
|
|
417
|
+
def dc_get_site()
|
|
418
|
+
return @site if @site # already cached
|
|
419
|
+
#
|
|
420
|
+
req = @parent ? @parent.request.url : request.url # different when called from renderer
|
|
421
|
+
uri = URI.parse(req)
|
|
422
|
+
@site = DcSite.find_by(name: uri.host)
|
|
423
|
+
# Site can be aliased
|
|
424
|
+
if @site and !@site.alias_for.blank?
|
|
425
|
+
@site = DcSite.find_by(name: @site.alias_for)
|
|
426
|
+
end
|
|
427
|
+
# Development environment. Check if site with name test exists and use
|
|
428
|
+
# homepagelink field as pointer to real site name.
|
|
429
|
+
if @site.nil? and ENV["RAILS_ENV"] != 'production'
|
|
430
|
+
@site = DcSite.find_by(name: 'test')
|
|
431
|
+
@site = DcSite.find_by(name: @site.alias_for) if @site
|
|
432
|
+
end
|
|
433
|
+
@site = nil if @site and !@site.active # site is disabled
|
|
434
|
+
@site
|
|
435
|
+
end
|
|
436
|
+
|
|
437
|
+
############################################################################
|
|
438
|
+
# Return array of policies defined in a site document formated to be used
|
|
439
|
+
# as choices select field, where policy_id field is defined in document.
|
|
440
|
+
#
|
|
441
|
+
# @example (as used in forms)
|
|
442
|
+
# name: policy_id
|
|
443
|
+
# type: select
|
|
444
|
+
# eval: dc_choices4_site_policies
|
|
445
|
+
# html:
|
|
446
|
+
# include_blank: true
|
|
447
|
+
############################################################################
|
|
448
|
+
def dc_choices4_site_policies()
|
|
449
|
+
site = dc_get_site()
|
|
450
|
+
site.dc_policies.all.inject([]) { |r, policy| r << [ policy.name, policy.id] if policy.active }
|
|
451
|
+
end
|
|
452
|
+
|
|
453
|
+
############################################################################
|
|
454
|
+
# Returns list of table names (collections) as array of choices for use in select field
|
|
455
|
+
# on data permission form. Method gets list of available collections from
|
|
456
|
+
# cms_menu.yml menu definition file.
|
|
457
|
+
#
|
|
458
|
+
# @example (as used in forms)
|
|
459
|
+
# eval: dc_choices4_tables_list
|
|
460
|
+
############################################################################
|
|
461
|
+
def dc_choices4_tables_list
|
|
462
|
+
menus = []
|
|
463
|
+
DrgCms.paths(:forms).reverse.each do |path|
|
|
464
|
+
f = "#{path}/cms_menu.yml"
|
|
465
|
+
menus << YAML.load_file(f)['menu'] if File.exist?(f)
|
|
466
|
+
end
|
|
467
|
+
#
|
|
468
|
+
choices = [] #['Default permission','Default permission']]
|
|
469
|
+
menus.each do |section|
|
|
470
|
+
section['items'].each do |e|
|
|
471
|
+
c = t(e['caption'], e['caption'])
|
|
472
|
+
choices << ["#{c} - #{e['params']['table']}", e['params']['table']]
|
|
473
|
+
end
|
|
474
|
+
end
|
|
475
|
+
choices
|
|
476
|
+
end
|
|
477
|
+
|
|
478
|
+
##########################################################################
|
|
479
|
+
# Returns available choices used by collection edit select field on CMS top menu.
|
|
480
|
+
#
|
|
481
|
+
# @example: dc_choices4_cmsmenu
|
|
482
|
+
#
|
|
483
|
+
# Returns 2d array ready for use in select field.
|
|
484
|
+
##########################################################################
|
|
485
|
+
def dc_choices4_cmsmenu()
|
|
486
|
+
menus = []
|
|
487
|
+
DrgCms.paths(:forms).reverse.each do |path|
|
|
488
|
+
f = "#{path}/cms_menu.yml"
|
|
489
|
+
menus << YAML.load_file(f)['menu'] if File.exist?(f)
|
|
490
|
+
end
|
|
491
|
+
#
|
|
492
|
+
choices = []
|
|
493
|
+
menus.each do |v|
|
|
494
|
+
choices << ["--- #{ t(v['section'], v['section']) }",'#']
|
|
495
|
+
v['items'].each do |i|
|
|
496
|
+
opts = { controller: i['controller'], action: i['action'] }
|
|
497
|
+
i['params'].each {|k,v| opts.merge!(k => v) }
|
|
498
|
+
choices << [ t(i['caption'],i['caption']), url_for( opts ) ]
|
|
499
|
+
end
|
|
500
|
+
end
|
|
501
|
+
choices
|
|
502
|
+
end
|
|
503
|
+
|
|
504
|
+
############################################################################
|
|
505
|
+
# Returns list of directories as array of choices for use in select field
|
|
506
|
+
# on folder permission form.
|
|
507
|
+
#
|
|
508
|
+
# @example (as used in forms)
|
|
509
|
+
# eval: dc_choices4_folders_list
|
|
510
|
+
############################################################################
|
|
511
|
+
def dc_choices4_folders_list
|
|
512
|
+
public = File.join(Rails.root,'public')
|
|
513
|
+
home = File.join(public,dc_get_site.files_directory)
|
|
514
|
+
choices = Dir.glob(home + '/**/*/').select { |fn| File.directory?(fn) }
|
|
515
|
+
choices << home # add home
|
|
516
|
+
choices.collect! {|e| e.gsub(public,'')} # remove public part
|
|
517
|
+
choices.sort
|
|
518
|
+
end
|
|
519
|
+
|
|
520
|
+
############################################################################
|
|
521
|
+
# Returns choices for select input filed.
|
|
522
|
+
#
|
|
523
|
+
# @example
|
|
524
|
+
# dc_choices4('dc_mail_list', 'name', '_id', :site_only => true)
|
|
525
|
+
#
|
|
526
|
+
# @param [ model ] table (collection) model name.
|
|
527
|
+
# @param [ name ] field name with description
|
|
528
|
+
# @param [ id ] field name with id field. Default value is '_id'
|
|
529
|
+
#
|
|
530
|
+
############################################################################
|
|
531
|
+
def dc_choices4(model, name, id='_id', options = {})
|
|
532
|
+
qry = model.classify.constantize.only(id, name).sort(name => 1)
|
|
533
|
+
qry = qry.where(dc_site_id: dc_get_site()) if options[:site_only]
|
|
534
|
+
r = []
|
|
535
|
+
qry.each {|v| r << [ v[name], v[id] ] }
|
|
536
|
+
r
|
|
537
|
+
end
|
|
538
|
+
|
|
539
|
+
############################################################################
|
|
540
|
+
# Adds new key to record cookie, thus preparing some initial values for creating
|
|
541
|
+
# new record on the next call.
|
|
542
|
+
#
|
|
543
|
+
# @example
|
|
544
|
+
# dc_add2_record_cookie(hash)
|
|
545
|
+
#
|
|
546
|
+
# @param [ hash ] hash of cookies to add
|
|
547
|
+
############################################################################
|
|
548
|
+
def dc_add2_record_cookie(hash)
|
|
549
|
+
kukis = if @parent.cookies[:record] and @parent.cookies[:record].size > 0
|
|
550
|
+
Marshal.load(@parent.cookies[:record])
|
|
551
|
+
else
|
|
552
|
+
{}
|
|
553
|
+
end
|
|
554
|
+
hash.each {|k,v| kukis[k] = v }
|
|
555
|
+
@parent.cookies[:record] = Marshal.dump(kukis)
|
|
556
|
+
end
|
|
557
|
+
|
|
558
|
+
############################################################################
|
|
559
|
+
# Returns true if access_policy allows user to view cms part
|
|
560
|
+
# Returns false and message if access is not allowed
|
|
561
|
+
#
|
|
562
|
+
# @example
|
|
563
|
+
# dc_user_can_view(@parent, @page)
|
|
564
|
+
# dc_user_can_view(@parent, @page.policy_id)
|
|
565
|
+
#
|
|
566
|
+
# @param [ ctrl ] Controller object or object which holds methods to access session.
|
|
567
|
+
# @param [ policy_id ] Policy id to check. If record is send as parameter, method will
|
|
568
|
+
# check for policy_id field and use that field.
|
|
569
|
+
############################################################################
|
|
570
|
+
def dc_user_can_view(ctrl, policy_id)
|
|
571
|
+
policy_id = policy_id.policy_id if policy_id and policy_id.respond_to?(:policy_id)
|
|
572
|
+
# Eventualy object without policy_id will be checked. This is to prevent error
|
|
573
|
+
policy_id = nil unless policy_id.class == BSON::ObjectId
|
|
574
|
+
#
|
|
575
|
+
site = ctrl.site
|
|
576
|
+
policies = site.dc_policies
|
|
577
|
+
# permission defined by default policy
|
|
578
|
+
default_policy = policies.find_by(is_default: true)
|
|
579
|
+
return false, 'Default accsess policy not found for the site!' unless default_policy
|
|
580
|
+
h = {}
|
|
581
|
+
default_policy.dc_policy_rules.to_a.each { |v| h[v.dc_policy_role_id] = v.permission }
|
|
582
|
+
# update permissions with defined policy
|
|
583
|
+
part_policy = nil
|
|
584
|
+
if policy_id
|
|
585
|
+
part_policy = policies.find(policy_id)
|
|
586
|
+
return false, 'Access policy not found for part!' unless part_policy
|
|
587
|
+
part_policy.dc_policy_rules.to_a.each { |v| h[v.dc_policy_role_id] = v.permission }
|
|
588
|
+
end
|
|
589
|
+
# p h
|
|
590
|
+
# apply guest role if user has no roles defined
|
|
591
|
+
if ctrl.session[:user_roles].nil?
|
|
592
|
+
role = DcPolicyRole.find_by(system_name: 'guest', active: true)
|
|
593
|
+
return false, 'System guest role not defined!' unless role
|
|
594
|
+
ctrl.session[:user_roles] = [role.id]
|
|
595
|
+
end
|
|
596
|
+
# Check if user has any role that allows him to view part
|
|
597
|
+
can_view, msg = false,''
|
|
598
|
+
ctrl.session[:user_roles].each do |role|
|
|
599
|
+
next unless h[role] # role not yet defined. Will die in next line.
|
|
600
|
+
if h[role] > 0
|
|
601
|
+
can_view = true
|
|
602
|
+
break
|
|
603
|
+
end
|
|
604
|
+
end
|
|
605
|
+
msg = if !can_view
|
|
606
|
+
part_policy ? t(part_policy.message,part_policy.message) : t(default_policy.message,default_policy.message)
|
|
607
|
+
end
|
|
608
|
+
return can_view, msg
|
|
609
|
+
end
|
|
610
|
+
|
|
611
|
+
####################################################################
|
|
612
|
+
# Return true if user has required role.
|
|
613
|
+
# @example
|
|
614
|
+
# dc_user_has_role('decision_maker', session[:user_id), session[:user_roles]) => true
|
|
615
|
+
#
|
|
616
|
+
# @param [ role ] Role. Can be passed as string or role object.
|
|
617
|
+
# @param [ user ] User id. If not passed session[:user_id] will be used.
|
|
618
|
+
# @param [ roles ] Array of roles that will be searched. If not passed session[:user_roles] will be used.
|
|
619
|
+
####################################################################
|
|
620
|
+
def dc_user_has_role( role, user=nil, roles=nil )
|
|
621
|
+
if roles.nil?
|
|
622
|
+
roles = (@parent ? @parent.session : session)[:user_roles]
|
|
623
|
+
end
|
|
624
|
+
if user.nil?
|
|
625
|
+
user = (@parent ? @parent.session : session)[:user_id]
|
|
626
|
+
end
|
|
627
|
+
return false if user.nil?
|
|
628
|
+
#
|
|
629
|
+
if role.class == String
|
|
630
|
+
rol = role
|
|
631
|
+
role = DcPolicyRole.find_by(name: rol)
|
|
632
|
+
role = DcPolicyRole.find_by(system_name: rol) if role.nil?
|
|
633
|
+
end
|
|
634
|
+
return false if role.nil?
|
|
635
|
+
# role is included in roles array
|
|
636
|
+
roles.include?(role._id)
|
|
637
|
+
end
|
|
638
|
+
|
|
639
|
+
####################################################################
|
|
640
|
+
# Returns true if parameter has value of 0, false, no or -. Returns default
|
|
641
|
+
# if parameter has nil value.
|
|
642
|
+
#
|
|
643
|
+
# @example
|
|
644
|
+
# dc_dont?('no') => true
|
|
645
|
+
# dc_dont?(1) => false
|
|
646
|
+
#
|
|
647
|
+
# @param [ string ] String to be examined
|
|
648
|
+
# @param [ default ] Default value when not set. false by default.
|
|
649
|
+
####################################################################
|
|
650
|
+
def dc_dont?(what, default=false)
|
|
651
|
+
return default if what.nil?
|
|
652
|
+
%w(0 no - false).include?(what.to_s.downcase.strip)
|
|
653
|
+
end
|
|
654
|
+
|
|
655
|
+
############################################################################
|
|
656
|
+
# Truncates string to the size and takes care, that words are not broken.
|
|
657
|
+
#
|
|
658
|
+
# @example
|
|
659
|
+
# dc_limit_string(description, 100)
|
|
660
|
+
#
|
|
661
|
+
# @param [ string ] Input string
|
|
662
|
+
# @param [ size ] Maximal size of the string
|
|
663
|
+
############################################################################
|
|
664
|
+
def dc_limit_string(string, size)
|
|
665
|
+
return string if string.size < size
|
|
666
|
+
string = string[0,size]
|
|
667
|
+
string.chop! until (string[-1,1] == ' ' or string == '')
|
|
668
|
+
string << '...'
|
|
669
|
+
end
|
|
670
|
+
|
|
671
|
+
############################################################################
|
|
672
|
+
# Returns key defined in BigTable as array of choices for use in select fields.
|
|
673
|
+
# It first checks if key is defined only for current site and then if site
|
|
674
|
+
# is not defined.
|
|
675
|
+
#
|
|
676
|
+
# @example
|
|
677
|
+
# eval: dc_big_table 'some-key' # as used on form
|
|
678
|
+
#
|
|
679
|
+
# @param [ string ] Key to be returned
|
|
680
|
+
############################################################################
|
|
681
|
+
def dc_big_table(key)
|
|
682
|
+
ret = []
|
|
683
|
+
bt = DcBigTable.find_by(key: key, site: dc_get_site._id, active: true)
|
|
684
|
+
bt = DcBigTable.find_by(key: key, site: nil, active: true) if bt.nil?
|
|
685
|
+
return ret if bt.nil?
|
|
686
|
+
#
|
|
687
|
+
locale = I18n.locale.to_s
|
|
688
|
+
bt.dc_big_table_values.each do |v| # iterate each value
|
|
689
|
+
next unless v.active
|
|
690
|
+
desc = ''
|
|
691
|
+
v.dc_big_table_locales.each do |l| # iterate each locale
|
|
692
|
+
if l.locale == locale
|
|
693
|
+
desc = l.description
|
|
694
|
+
break
|
|
695
|
+
end
|
|
696
|
+
end
|
|
697
|
+
desc = v.description if desc.blank? # get description from value description
|
|
698
|
+
desc = v.value if desc.blank? # still blank. Use value as description
|
|
699
|
+
ret << [desc, v.value]
|
|
700
|
+
end
|
|
701
|
+
ret
|
|
702
|
+
end
|
|
703
|
+
|
|
704
|
+
end
|