drg_cms 0.4.39

Sign up to get free protection for your applications and to get access to all the features.
Files changed (204) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +3 -0
  4. data/Rakefile +39 -0
  5. data/app/assets/images/drg_cms/add.png +0 -0
  6. data/app/assets/images/drg_cms/arrow_in.png +0 -0
  7. data/app/assets/images/drg_cms/arrow_out.png +0 -0
  8. data/app/assets/images/drg_cms/checkbox-checked.png +0 -0
  9. data/app/assets/images/drg_cms/checkbox-unchecked.png +0 -0
  10. data/app/assets/images/drg_cms/cols.png +0 -0
  11. data/app/assets/images/drg_cms/copy.png +0 -0
  12. data/app/assets/images/drg_cms/edit.png +0 -0
  13. data/app/assets/images/drg_cms/edit_design.png +0 -0
  14. data/app/assets/images/drg_cms/edit_page.png +0 -0
  15. data/app/assets/images/drg_cms/edit_site.png +0 -0
  16. data/app/assets/images/drg_cms/html.png +0 -0
  17. data/app/assets/images/drg_cms/pin.png +0 -0
  18. data/app/assets/images/drg_cms/printer.png +0 -0
  19. data/app/assets/images/drg_cms/reload.png +0 -0
  20. data/app/assets/images/drg_cms/search_16.png +0 -0
  21. data/app/assets/images/drg_cms/spinner.gif +0 -0
  22. data/app/assets/images/drg_cms/view_tile.png +0 -0
  23. data/app/assets/images/drg_cms/x.png +0 -0
  24. data/app/assets/javascripts/drg_cms/drg_cms.js +449 -0
  25. data/app/assets/javascripts/drg_cms/jquery-migrate.js +511 -0
  26. data/app/assets/javascripts/drg_cms/jquery.datetimepicker.js +1353 -0
  27. data/app/assets/javascripts/drg_cms/some_scripts.js +33 -0
  28. data/app/assets/javascripts/drg_cms_application.js +11 -0
  29. data/app/assets/javascripts/drg_cms_cms.js +28 -0
  30. data/app/assets/stylesheets/drg_cms/drg_cms.css +632 -0
  31. data/app/assets/stylesheets/drg_cms/jquery-ui.css +339 -0
  32. data/app/assets/stylesheets/drg_cms/jquery.datetimepicker.css +304 -0
  33. data/app/assets/stylesheets/drg_cms/th-bg.png +0 -0
  34. data/app/assets/stylesheets/drg_cms/theme.css +49 -0
  35. data/app/assets/stylesheets/drg_cms_application.css +12 -0
  36. data/app/assets/stylesheets/drg_cms_cms.css +26 -0
  37. data/app/controllers/cmsedit_controller.rb +673 -0
  38. data/app/controllers/dc_application_controller.rb +385 -0
  39. data/app/controllers/dc_at_the_beginning_controller.rb +120 -0
  40. data/app/controllers/dc_common_controller.rb +314 -0
  41. data/app/controllers/dc_mail_controller.rb +89 -0
  42. data/app/controllers/dc_main_controller.rb +40 -0
  43. data/app/controllers/drgcms_controls/dc_page_controls.rb +40 -0
  44. data/app/forms/all_options.yml +176 -0
  45. data/app/forms/cms_forms.yml +93 -0
  46. data/app/forms/cms_menu.yml +142 -0
  47. data/app/forms/dc_ad.yml +130 -0
  48. data/app/forms/dc_big_table.yml +59 -0
  49. data/app/forms/dc_big_table_locale.yml +41 -0
  50. data/app/forms/dc_big_table_value.yml +47 -0
  51. data/app/forms/dc_category.yml +57 -0
  52. data/app/forms/dc_design.yml +68 -0
  53. data/app/forms/dc_folder_permission.yml +49 -0
  54. data/app/forms/dc_forum_cat.yml +54 -0
  55. data/app/forms/dc_forum_forum.yml +53 -0
  56. data/app/forms/dc_forum_msg.yml +124 -0
  57. data/app/forms/dc_forum_privmsg.yml +125 -0
  58. data/app/forms/dc_forum_topic.yml +131 -0
  59. data/app/forms/dc_journal.yml +85 -0
  60. data/app/forms/dc_link.yml +55 -0
  61. data/app/forms/dc_mail.yml +88 -0
  62. data/app/forms/dc_mail_address.yml +56 -0
  63. data/app/forms/dc_mail_list.yml +44 -0
  64. data/app/forms/dc_mail_list_member.yml +42 -0
  65. data/app/forms/dc_menu.yml +62 -0
  66. data/app/forms/dc_menu_item.yml +81 -0
  67. data/app/forms/dc_page.yml +145 -0
  68. data/app/forms/dc_part.yml +102 -0
  69. data/app/forms/dc_permission.yml +50 -0
  70. data/app/forms/dc_piece.yml +105 -0
  71. data/app/forms/dc_policy.yml +57 -0
  72. data/app/forms/dc_policy_role.yml +42 -0
  73. data/app/forms/dc_policy_rule.yml +38 -0
  74. data/app/forms/dc_policy_rule_nocms.yml +38 -0
  75. data/app/forms/dc_poll.yml +113 -0
  76. data/app/forms/dc_poll_item.yml +76 -0
  77. data/app/forms/dc_simple_menu.yml +64 -0
  78. data/app/forms/dc_simple_menu_item.yml +80 -0
  79. data/app/forms/dc_site.yml +149 -0
  80. data/app/forms/dc_user.yml +142 -0
  81. data/app/forms/dc_user_role.yml +54 -0
  82. data/app/forms/drgcms_cms.yml +28 -0
  83. data/app/helpers/cmsedit_helper.rb +698 -0
  84. data/app/helpers/dc_ad_renderer.rb +206 -0
  85. data/app/helpers/dc_application_helper.rb +704 -0
  86. data/app/helpers/dc_big_menu_renderer.rb +180 -0
  87. data/app/helpers/dc_captcha_renderer.rb +100 -0
  88. data/app/helpers/dc_common_renderer.rb +132 -0
  89. data/app/helpers/dc_mail_renderer.rb +76 -0
  90. data/app/helpers/dc_menu_renderer.rb +143 -0
  91. data/app/helpers/dc_page_renderer.rb +80 -0
  92. data/app/helpers/dc_part_renderer.rb +162 -0
  93. data/app/helpers/dc_piece_renderer.rb +124 -0
  94. data/app/helpers/dc_poll_renderer.rb +219 -0
  95. data/app/helpers/dc_renderer.rb +56 -0
  96. data/app/helpers/dc_simple_menu_renderer.rb +244 -0
  97. data/app/helpers/drgcms_form_field.rb +863 -0
  98. data/app/models/__dc_global_data.rb +44 -0
  99. data/app/models/dc_ad.rb +52 -0
  100. data/app/models/dc_ad_stat.rb +34 -0
  101. data/app/models/dc_big_menu.rb +89 -0
  102. data/app/models/dc_big_table.rb +63 -0
  103. data/app/models/dc_big_table_locale.rb +35 -0
  104. data/app/models/dc_big_table_value.rb +38 -0
  105. data/app/models/dc_category.rb +48 -0
  106. data/app/models/dc_design.rb +48 -0
  107. data/app/models/dc_dummy.rb +30 -0
  108. data/app/models/dc_folder_permission.rb +43 -0
  109. data/app/models/dc_global_data.rb +44 -0
  110. data/app/models/dc_journal.rb +39 -0
  111. data/app/models/dc_key_value_store.rb +90 -0
  112. data/app/models/dc_link.rb +39 -0
  113. data/app/models/dc_mail.rb +64 -0
  114. data/app/models/dc_mail_address.rb +69 -0
  115. data/app/models/dc_mail_list.rb +48 -0
  116. data/app/models/dc_mail_list_member.rb +34 -0
  117. data/app/models/dc_menu.rb +59 -0
  118. data/app/models/dc_menu_item.rb +40 -0
  119. data/app/models/dc_page.rb +123 -0
  120. data/app/models/dc_part.rb +28 -0
  121. data/app/models/dc_permission.rb +58 -0
  122. data/app/models/dc_piece.rb +57 -0
  123. data/app/models/dc_policy.rb +94 -0
  124. data/app/models/dc_policy_role.rb +47 -0
  125. data/app/models/dc_policy_rule.rb +65 -0
  126. data/app/models/dc_poll.rb +46 -0
  127. data/app/models/dc_poll_item.rb +40 -0
  128. data/app/models/dc_sendmail.rb +48 -0
  129. data/app/models/dc_simple_menu.rb +58 -0
  130. data/app/models/dc_simple_menu_item.rb +39 -0
  131. data/app/models/dc_site.rb +92 -0
  132. data/app/models/dc_stat.rb +36 -0
  133. data/app/models/dc_user.rb +91 -0
  134. data/app/models/dc_user_role.rb +36 -0
  135. data/app/models/dc_visit.rb +35 -0
  136. data/app/views/cmsedit/_edit_stuff.html.erb +59 -0
  137. data/app/views/cmsedit/_edit_stuff.js.erb +6 -0
  138. data/app/views/cmsedit/_form.html.erb +21 -0
  139. data/app/views/cmsedit/_result.html.erb +20 -0
  140. data/app/views/cmsedit/edit.html.erb +6 -0
  141. data/app/views/cmsedit/error.html.erb +2 -0
  142. data/app/views/cmsedit/index.html.erb +6 -0
  143. data/app/views/cmsedit/new.html.erb +5 -0
  144. data/app/views/cmsedit/show.html.erb +21 -0
  145. data/app/views/dc_at_the_beginning/create.html.erb +9 -0
  146. data/app/views/dc_at_the_beginning/index.html.erb +19 -0
  147. data/app/views/dc_common/paste_clipboard.html.erb +17 -0
  148. data/app/views/dc_mail/subscribe.html.erb +7 -0
  149. data/app/views/dc_mail/unsubscribe.html.erb +19 -0
  150. data/app/views/layouts/cms.html.erb +17 -0
  151. data/app/views/layouts/cmsedit.html.erb +16 -0
  152. data/app/views/layouts/content.html.erb +16 -0
  153. data/config/initializers/kaminari_patch.rb +36 -0
  154. data/config/locales/datetimepicker.yml +13 -0
  155. data/config/locales/drgcms_en.yml +96 -0
  156. data/config/locales/drgcms_sl.yml +97 -0
  157. data/config/locales/en.yml +7 -0
  158. data/config/locales/kaminari.yml +26 -0
  159. data/config/locales/models_en.yml +790 -0
  160. data/config/locales/models_sl.yml +805 -0
  161. data/config/locales/mongoid_sl.yml +60 -0
  162. data/config/locales/sl.yml +211 -0
  163. data/config/routes.rb +2 -0
  164. data/drg_cms.gemspec +28 -0
  165. data/lib/drg_cms.rb +45 -0
  166. data/lib/drg_cms/engine.rb +30 -0
  167. data/lib/drg_cms/version.rb +3 -0
  168. data/lib/tasks/at_the_beginning.yml +26 -0
  169. data/lib/tasks/dc_cleanup.rake +94 -0
  170. data/lib/tasks/drg_cms_tasks.rake +118 -0
  171. data/lib/tasks/send_mail.rake +253 -0
  172. data/lib/tasks/site_statistics.rake +80 -0
  173. data/test/drg_cms_test.rb +7 -0
  174. data/test/dummy/README.rdoc +261 -0
  175. data/test/dummy/Rakefile +7 -0
  176. data/test/dummy/app/assets/javascripts/application.js +15 -0
  177. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  178. data/test/dummy/app/controllers/application_controller.rb +3 -0
  179. data/test/dummy/app/helpers/application_helper.rb +2 -0
  180. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  181. data/test/dummy/config.ru +4 -0
  182. data/test/dummy/config/application.rb +59 -0
  183. data/test/dummy/config/boot.rb +10 -0
  184. data/test/dummy/config/database.yml +25 -0
  185. data/test/dummy/config/environment.rb +5 -0
  186. data/test/dummy/config/environments/development.rb +37 -0
  187. data/test/dummy/config/environments/production.rb +67 -0
  188. data/test/dummy/config/environments/test.rb +37 -0
  189. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  190. data/test/dummy/config/initializers/inflections.rb +15 -0
  191. data/test/dummy/config/initializers/mime_types.rb +5 -0
  192. data/test/dummy/config/initializers/secret_token.rb +7 -0
  193. data/test/dummy/config/initializers/session_store.rb +8 -0
  194. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  195. data/test/dummy/config/locales/en.yml +5 -0
  196. data/test/dummy/config/routes.rb +58 -0
  197. data/test/dummy/public/404.html +26 -0
  198. data/test/dummy/public/422.html +26 -0
  199. data/test/dummy/public/500.html +25 -0
  200. data/test/dummy/public/favicon.ico +0 -0
  201. data/test/dummy/script/rails +6 -0
  202. data/test/integration/navigation_test.rb +10 -0
  203. data/test/test_helper.rb +15 -0
  204. 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