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,385 @@
|
|
|
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
|
+
class DcApplicationController < ActionController::Base
|
|
25
|
+
protect_from_forgery
|
|
26
|
+
|
|
27
|
+
########################################################################
|
|
28
|
+
# Writes anything passed as parameter to log/dump file.
|
|
29
|
+
#
|
|
30
|
+
# Very usefull for debuging strange errors.
|
|
31
|
+
########################################################################
|
|
32
|
+
def dc_dump(*args)
|
|
33
|
+
args.each do |arg|
|
|
34
|
+
File.open(Rails.root.join('log/dump.log'),'a') {|f| f.write(arg.to_s + "\n") }
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
####################################################################
|
|
39
|
+
# return true if in edit mode
|
|
40
|
+
####################################################################
|
|
41
|
+
def dc_edit_mode?
|
|
42
|
+
session[:edit_mode] > 1
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
####################################################################
|
|
46
|
+
# Return true if user has required role
|
|
47
|
+
####################################################################
|
|
48
|
+
def dc_user_has_role( role, user=session[:user_id] )
|
|
49
|
+
if role.class == String
|
|
50
|
+
rol = role
|
|
51
|
+
role = DcPolicyRole.find_by(name: rol)
|
|
52
|
+
role = DcPolicyRole.find_by(system_name: rol) if role.nil?
|
|
53
|
+
end
|
|
54
|
+
return false if role.nil?
|
|
55
|
+
# role is found in user_roles
|
|
56
|
+
session[:user_roles].include?(role._id)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
####################################################################
|
|
60
|
+
# Determine site from url and return site record (document)
|
|
61
|
+
####################################################################
|
|
62
|
+
def dc_get_site()
|
|
63
|
+
return @site if @site
|
|
64
|
+
uri = URI.parse(request.url)
|
|
65
|
+
@site = DcSite.find_by(name: uri.host)
|
|
66
|
+
# Site can be aliased
|
|
67
|
+
if @site and !@site.alias_for.blank?
|
|
68
|
+
@site = DcSite.find_by(name: @site.alias_for)
|
|
69
|
+
end
|
|
70
|
+
# Development environment. Check if site with name test exists and use
|
|
71
|
+
# alias_for as pointer to real site.
|
|
72
|
+
if @site.nil? and ENV["RAILS_ENV"] != 'production'
|
|
73
|
+
@site = DcSite.find_by(name: 'test')
|
|
74
|
+
@site = DcSite.find_by(name: @site.alias_for) if @site
|
|
75
|
+
end
|
|
76
|
+
@site = nil if @site and !@site.active # site is disabled
|
|
77
|
+
@site
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
####################################################################
|
|
81
|
+
# Determine and return site record from url. It would be nice but it is not working.
|
|
82
|
+
####################################################################
|
|
83
|
+
def self.dc_get_site_()
|
|
84
|
+
#self.dc_get_site()
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
########################################################################
|
|
88
|
+
# Searches forms file in forms path and returns it's name.
|
|
89
|
+
########################################################################
|
|
90
|
+
def dc_find_form_file(form)
|
|
91
|
+
DrgCms.paths(:forms).reverse.each do |path|
|
|
92
|
+
f = "#{path}/#{form}.yml"
|
|
93
|
+
return f if File.exist?(f)
|
|
94
|
+
end
|
|
95
|
+
p "Form file #{form} not found!"
|
|
96
|
+
nil
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
#######################################################################
|
|
100
|
+
# Render 404 error with some debug includded
|
|
101
|
+
########################################################################
|
|
102
|
+
def dc_render_404(where_the_error_is=nil)
|
|
103
|
+
render(file: "#{Rails.root}/public/404", :status => 404, :layout => false, :formats => [:html],
|
|
104
|
+
locals: {error_is: where_the_error_is})
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
########################################################################
|
|
108
|
+
# Log visit to dc_visit
|
|
109
|
+
########################################################################
|
|
110
|
+
def dc_log_visit()
|
|
111
|
+
if request.env["HTTP_USER_AGENT"] and request.env["HTTP_USER_AGENT"].match(/\(.*https?:\/\/.*\)/)
|
|
112
|
+
logger.info "ROBOT: #{Time.now.strftime('%Y.%m.%d %H:%M:%S')} id=#{@page.id} ip=#{request.remote_ip}."
|
|
113
|
+
session[:is_robot] = true
|
|
114
|
+
else
|
|
115
|
+
DcVisit.create(site_id: @site.id,
|
|
116
|
+
user_id: session[:user_id],
|
|
117
|
+
page_id: @page.id,
|
|
118
|
+
ip: request.remote_ip,
|
|
119
|
+
session_id: request.session_options[:id],
|
|
120
|
+
time: Time.now )
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
protected
|
|
125
|
+
|
|
126
|
+
#############################################################################
|
|
127
|
+
# Add permissions. Subroutine of dc_user_can
|
|
128
|
+
############################################################################
|
|
129
|
+
def add_permissions_l(table_name=nil) # NODOC
|
|
130
|
+
perm = table_name.nil? ? DcPermission.find_by(is_default: true) : DcPermission.find_by(table_name: table_name, active: true)
|
|
131
|
+
(perm.dc_policy_rules.each {|p1| @permissions[p1.dc_policy_role_id] = p1.permission }) if perm
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
############################################################################
|
|
135
|
+
# Returns true if user's role permits to perform operation on a table(collection)
|
|
136
|
+
# with required permission.
|
|
137
|
+
#
|
|
138
|
+
# @example
|
|
139
|
+
# dc_user_can(DcPermission::CAN_VIEW, params[:table])
|
|
140
|
+
#
|
|
141
|
+
# @param [ permission ] Required permission level
|
|
142
|
+
# @param [ table ] Name of table(collection) for which permission is required
|
|
143
|
+
# Defaults to params[:table]
|
|
144
|
+
############################################################################
|
|
145
|
+
def dc_user_can(permission, table=params[:table])
|
|
146
|
+
if @permissions.nil?
|
|
147
|
+
@permissions = {}
|
|
148
|
+
add_permissions_l # default permission
|
|
149
|
+
table_name = ''
|
|
150
|
+
# permission can be set for table or object embedded in table. Read all possible values
|
|
151
|
+
table.strip.downcase.split(';').each do |t|
|
|
152
|
+
table_name << (table_name.size > 0 ? ';' : '') + t # table;embedded;another;...
|
|
153
|
+
add_permissions_l table_name
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
# Sometimes anonymous user is allowed to use cmsedit. Search for system default role.
|
|
157
|
+
#TODO This might not be the best idea. Check in the future.
|
|
158
|
+
if session[:user_roles].nil?
|
|
159
|
+
guest = DcUserRole.find_by(:system_name => 'guest')
|
|
160
|
+
session[:user_roles] = guest ? [guest.id] : []
|
|
161
|
+
end
|
|
162
|
+
# Return true if any of the permissions user has is higher or equal to requested permission
|
|
163
|
+
session[:user_roles].each {|r| return true if @permissions[r] and @permissions[r] >= permission }
|
|
164
|
+
false
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
####################################################################
|
|
168
|
+
# Detects if called from mobile agent.
|
|
169
|
+
# According to http://detectmobilebrowsers.com/
|
|
170
|
+
####################################################################
|
|
171
|
+
def dc_set_is_mobile
|
|
172
|
+
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])
|
|
173
|
+
session[:is_mobile] = is_mobile ? 1 : 0
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
##########################################################################
|
|
178
|
+
# Merge values from params fields (from site, page ...) into internal @options hash.
|
|
179
|
+
##########################################################################
|
|
180
|
+
def dc_set_options(parameters)
|
|
181
|
+
@options ||= {}
|
|
182
|
+
return if parameters.to_s.size < 3
|
|
183
|
+
# parameters are set az YAML. This should be default in future.
|
|
184
|
+
parms = YAML.load(parameters) rescue nil
|
|
185
|
+
if parms.nil? # error when loadnig yaml, try the old way parsing manually
|
|
186
|
+
parms = {}
|
|
187
|
+
parameters.split("\n").each do |line|
|
|
188
|
+
line.chomp.split(',').each do |parm|
|
|
189
|
+
key, value = parm.split(':')
|
|
190
|
+
parms[key.strip] = value.to_s.strip.gsub(/\'|\"/,'')
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
@options.merge!(parms)
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
##########################################################################
|
|
198
|
+
# Default request processing.
|
|
199
|
+
##########################################################################
|
|
200
|
+
def dc_process_default_request()
|
|
201
|
+
session[:edit_mode] ||= 0
|
|
202
|
+
# Initialize parts
|
|
203
|
+
@parts = nil
|
|
204
|
+
@js, @css = '', ''
|
|
205
|
+
# find domain name in sites
|
|
206
|
+
@site = dc_get_site
|
|
207
|
+
# site is not defined. render 404 error
|
|
208
|
+
return dc_render_404('Site!') if @site.nil?
|
|
209
|
+
dc_set_options(@site.settings)
|
|
210
|
+
# HOMEPAGE. When no parameters is set
|
|
211
|
+
params[:path] = @site.homepage_link if params[:id].nil? and params[:path].nil?
|
|
212
|
+
# Search for page
|
|
213
|
+
pageclass = @site.page_table.classify.constantize
|
|
214
|
+
if params[:id]
|
|
215
|
+
#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])
|
|
217
|
+
@page = pageclass.find(params[:id]) if @page.nil? # I think that there will be more subject_link searchers than id
|
|
218
|
+
elsif params[:path]
|
|
219
|
+
# 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])
|
|
221
|
+
if @page.nil?
|
|
222
|
+
# no. Find if defined in links
|
|
223
|
+
link = DcLink.find_by(:dc_site_id.in => [@site._id, nil], name: params[:path])
|
|
224
|
+
if link
|
|
225
|
+
#pageclass.find_by(alt_link: params[:path])
|
|
226
|
+
dc_set_options link.params
|
|
227
|
+
@page = pageclass.find(link.page_id)
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
# if @page is not found render 404 error
|
|
232
|
+
return dc_render_404('Page!') unless @page
|
|
233
|
+
dc_set_options @page.params
|
|
234
|
+
dc_set_is_mobile unless session[:is_mobile] # do it only once per session
|
|
235
|
+
# find design if defined. Otherwise design MUST be declared in site
|
|
236
|
+
if @page.dc_design_id
|
|
237
|
+
@design = DcDesign.find(@page.dc_design_id)
|
|
238
|
+
return dc_render_404('Design!') unless @design
|
|
239
|
+
end
|
|
240
|
+
# Add edit menu
|
|
241
|
+
layout = 'content'
|
|
242
|
+
if session[:edit_mode] > 0
|
|
243
|
+
layout = 'cms'
|
|
244
|
+
session[:site_id] = @site.id
|
|
245
|
+
session[:site_page_table] = @site.page_table
|
|
246
|
+
session[:page_id] = @page.id
|
|
247
|
+
else
|
|
248
|
+
# Log only visits from non-editors
|
|
249
|
+
dc_log_visit()
|
|
250
|
+
end
|
|
251
|
+
@page_title = @page.subject.empty? ? @site.page_title : @page.subject
|
|
252
|
+
# render view. inline if defined in design
|
|
253
|
+
view_filename = ''
|
|
254
|
+
view_filename = @design.rails_view.to_s if @design
|
|
255
|
+
view_filename = @site.rails_view.to_s if view_filename.size < 5
|
|
256
|
+
if view_filename.size < 5
|
|
257
|
+
@design.body = "<%= render partial: 'cmsedit/edit_stuff' %>\n" + @design.body if session[:edit_mode] > 0
|
|
258
|
+
@design.body << '<style type="text/css"><%= @css.html_safe %></style><%= javascript_tag @js %>'
|
|
259
|
+
render(inline: @design.body, layout: layout)
|
|
260
|
+
else
|
|
261
|
+
render view_filename, layout: layout
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
########################################################################
|
|
266
|
+
# Decamelizes string. It probably doesn't work very good with non ascii chars.
|
|
267
|
+
# Therefore it is very unwise to use non ascii chars for table (collection) names.
|
|
268
|
+
########################################################################
|
|
269
|
+
def decamelize_type(st)
|
|
270
|
+
return nil unless st
|
|
271
|
+
r = ''
|
|
272
|
+
st.to_s.each_char do |c|
|
|
273
|
+
r << case
|
|
274
|
+
when r.size == 0 then c.downcase
|
|
275
|
+
when c.downcase != c then '_' + c.downcase
|
|
276
|
+
else c
|
|
277
|
+
end
|
|
278
|
+
end
|
|
279
|
+
r
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
####################################################################
|
|
283
|
+
# Return's error messages for the document formated for display on edit form.
|
|
284
|
+
#
|
|
285
|
+
# @param [ document ] Document var
|
|
286
|
+
####################################################################
|
|
287
|
+
def dc_error_messages_for(document)
|
|
288
|
+
return '' unless document.errors.any?
|
|
289
|
+
msg = ''
|
|
290
|
+
document.errors.each do |attribute, errors_array|
|
|
291
|
+
label = t("helpers.label.#{decamelize_type(document.class)}.#{attribute}")
|
|
292
|
+
msg << "<li>#{label} : #{errors_array}</li>"
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
html = <<eot
|
|
296
|
+
<div class="dc-form-error">
|
|
297
|
+
<h2>#{t('drgcms.errors_no')} #{document.errors.size}</h2>
|
|
298
|
+
<ul>#{msg}</ul>
|
|
299
|
+
</div>
|
|
300
|
+
eot
|
|
301
|
+
html.html_safe
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
####################################################################
|
|
305
|
+
# Checks if any errors exist on document and writes debug log. It can also
|
|
306
|
+
# crash if requested. This is mostly usefull in development for debuging
|
|
307
|
+
# model errors.
|
|
308
|
+
#
|
|
309
|
+
# @param [ document ] Document var
|
|
310
|
+
# @param [ crash ] Should crash when errors detected. Default = false.
|
|
311
|
+
####################################################################
|
|
312
|
+
def dc_check_model(document, crash=false)
|
|
313
|
+
return nil unless document.errors.any?
|
|
314
|
+
msg = ''
|
|
315
|
+
document.errors.each do |attribute, errors_array|
|
|
316
|
+
msg << "#{attribute}: #{errors_array}\n"
|
|
317
|
+
end
|
|
318
|
+
logger.debug(msg)
|
|
319
|
+
crash_it if crash
|
|
320
|
+
msg
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
######################################################################
|
|
324
|
+
# Can call rake task from controller.
|
|
325
|
+
# @example
|
|
326
|
+
# dc_call_rake('clear:all', some_parm: some_id)
|
|
327
|
+
#
|
|
328
|
+
# @param [ task ] Rake task name
|
|
329
|
+
# @param [ options ] Options that will be send to task as environment variables
|
|
330
|
+
######################################################################
|
|
331
|
+
def dc_call_rake(task, options = {})
|
|
332
|
+
options[:rails_env] ||= Rails.env
|
|
333
|
+
args = options.map { |o, v| "#{o.to_s.upcase}='#{v}'" }
|
|
334
|
+
system "rake #{task} #{args.join(' ')} --trace 2>&1 >> #{Rails.root}/log/rake.log &"
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
######################################################################
|
|
338
|
+
# Small helper for formating ajax return from controller. This is higly experimental.
|
|
339
|
+
# @example
|
|
340
|
+
# dc_render_ajax(operation: :div, prepand: html_code)
|
|
341
|
+
#
|
|
342
|
+
# @param [ task ] Rake task name
|
|
343
|
+
# @param [ options ] Options that will be send to task as environment variables
|
|
344
|
+
######################################################################
|
|
345
|
+
def dc_render_ajax(opts)
|
|
346
|
+
result = {}
|
|
347
|
+
if opts[:operation].to_s == 'div' or opts[:operation].to_s == 'class'
|
|
348
|
+
selector = opts[:operation].to_s == 'div' ? '#' : '.' # for div . for class
|
|
349
|
+
key = case
|
|
350
|
+
when opts[:prepend] then "#{selector}+div"
|
|
351
|
+
when opts[:append] then "#{selector}div+"
|
|
352
|
+
else "#{selector}div"
|
|
353
|
+
end
|
|
354
|
+
key << '_' + opts[ opts[:operation].to_sym ]
|
|
355
|
+
else
|
|
356
|
+
key = opts[:operation] + '_'
|
|
357
|
+
end
|
|
358
|
+
result[key] = opts[:value] || opts[:url] || ''
|
|
359
|
+
render inline: result.to_json, formats: 'js'
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
########################################################################
|
|
363
|
+
# Find document by parameters
|
|
364
|
+
# @example
|
|
365
|
+
# dc_find_document(params[:table], params[:id], params[:ids]
|
|
366
|
+
#
|
|
367
|
+
# @param [ table ] table (collection) name. Could be dc_page;dc_part;... when embedded document
|
|
368
|
+
# @param [ id ] Id of the document
|
|
369
|
+
# @param [ ids ] Ids of parent documents when document is embedded. Ids are separated by ; char.
|
|
370
|
+
########################################################################
|
|
371
|
+
def dc_find_document(table, id, ids)
|
|
372
|
+
tables = table.split(';')
|
|
373
|
+
if tables.size == 1
|
|
374
|
+
doc = tables.first.classify.constantize.find(id)
|
|
375
|
+
else
|
|
376
|
+
ids = ids.split(';')
|
|
377
|
+
doc = tables.first.classify.constantize.find(ids.first) # top most record
|
|
378
|
+
1.upto(tables.size - 2) { |i| doc = doc.send(tables[i].pluralize).find(ids[i]) } # find embedded childrens by ids
|
|
379
|
+
doc = doc.send(tables.last.pluralize).find(id) # our record
|
|
380
|
+
end
|
|
381
|
+
doc
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
end
|
|
@@ -0,0 +1,120 @@
|
|
|
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 BUT 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 DcAtTheBeginningController < DcApplicationController
|
|
28
|
+
|
|
29
|
+
before_filter :check_if_ok
|
|
30
|
+
|
|
31
|
+
########################################################################
|
|
32
|
+
#
|
|
33
|
+
########################################################################
|
|
34
|
+
def index
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
########################################################################
|
|
38
|
+
#
|
|
39
|
+
########################################################################
|
|
40
|
+
def create
|
|
41
|
+
if params['password1'] != params['password2']
|
|
42
|
+
flash[:error] = "Password doesn't match!"
|
|
43
|
+
return render action: 'index'
|
|
44
|
+
end
|
|
45
|
+
if params['password1'].size < 8
|
|
46
|
+
flash[:error] = "Please be more creative. Password should be at least 8 characters long!"
|
|
47
|
+
return render action: 'index'
|
|
48
|
+
end
|
|
49
|
+
# New role
|
|
50
|
+
role = DcPolicyRole.new
|
|
51
|
+
role.name = 'superadmin'
|
|
52
|
+
role.system_name = 'superadmin'
|
|
53
|
+
role.save
|
|
54
|
+
# User
|
|
55
|
+
usr = DcUser.new
|
|
56
|
+
usr.username = params['username']
|
|
57
|
+
usr.password = params['password1']
|
|
58
|
+
usr.password_confirmation = params['password2']
|
|
59
|
+
usr.first_name = 'superadmin'
|
|
60
|
+
usr.save
|
|
61
|
+
# user role
|
|
62
|
+
r = usr.dc_user_roles.new
|
|
63
|
+
r.dc_policy_role_id = role._id
|
|
64
|
+
r.save
|
|
65
|
+
# cmsedit permission
|
|
66
|
+
permission = DcPermission.new
|
|
67
|
+
permission.table_name = 'Default permission'
|
|
68
|
+
permission.is_default = true
|
|
69
|
+
permission.save
|
|
70
|
+
#
|
|
71
|
+
r = permission.dc_policy_rules.new
|
|
72
|
+
r.dc_policy_role_id = role._id
|
|
73
|
+
r.permission = DcPermission::SUPERADMIN
|
|
74
|
+
r.save
|
|
75
|
+
# create login poll
|
|
76
|
+
poll = DcPoll.new
|
|
77
|
+
poll.name = 'login'
|
|
78
|
+
poll.display = 'td'
|
|
79
|
+
poll.operation = 'link'
|
|
80
|
+
poll.parameters = '/dc_common/process_login'
|
|
81
|
+
poll.title = 'Autocreated login form'
|
|
82
|
+
poll.save
|
|
83
|
+
#
|
|
84
|
+
i = poll.dc_poll_items.new
|
|
85
|
+
i.name = 'username'
|
|
86
|
+
i.size = 15
|
|
87
|
+
i.text = 'Username'
|
|
88
|
+
i.type = 'text_field'
|
|
89
|
+
i.save
|
|
90
|
+
#
|
|
91
|
+
i = poll.dc_poll_items.new
|
|
92
|
+
i.name = 'password'
|
|
93
|
+
i.size = 15
|
|
94
|
+
i.text = 'Password'
|
|
95
|
+
i.type = 'password_field'
|
|
96
|
+
i.save
|
|
97
|
+
#
|
|
98
|
+
i = poll.dc_poll_items.new
|
|
99
|
+
i.name = 'send'
|
|
100
|
+
i.text = 'Login'
|
|
101
|
+
i.type = 'submit_tag'
|
|
102
|
+
i.save
|
|
103
|
+
|
|
104
|
+
redirect_to '/cmsedit/login'
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
########################################################################
|
|
108
|
+
#
|
|
109
|
+
########################################################################
|
|
110
|
+
def check_if_ok
|
|
111
|
+
DcPermission.all.delete
|
|
112
|
+
DcUserRole.all.delete
|
|
113
|
+
DcUser.all.delete
|
|
114
|
+
return dc_render_404('At the beginning: It can only be done in development!') if ENV["RAILS_ENV"] != 'development'
|
|
115
|
+
return dc_render_404('At the beginning: Permissions table is not empty!') if DcPermission.all.size > 0
|
|
116
|
+
return dc_render_404('At the beginning: Roles table is not empty!') if DcUserRole.all.size > 0
|
|
117
|
+
return dc_render_404('At the beginning: Users table is not empty!') if DcUser.all.size > 0
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
end
|