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