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.
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