humpyard 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (197) hide show
  1. data/Gemfile +28 -0
  2. data/README.rdoc +61 -0
  3. data/VERSION +1 -0
  4. data/app/controllers/humpyard/assets_controller.rb +123 -0
  5. data/app/controllers/humpyard/elements_controller.rb +200 -0
  6. data/app/controllers/humpyard/errors_controller.rb +8 -0
  7. data/app/controllers/humpyard/pages_controller.rb +365 -0
  8. data/app/helpers/humpyard/pages_helper.rb +19 -0
  9. data/app/models/humpyard/asset.rb +22 -0
  10. data/app/models/humpyard/assets/paperclip_asset.rb +48 -0
  11. data/app/models/humpyard/assets/youtube_asset.rb +38 -0
  12. data/app/models/humpyard/element.rb +57 -0
  13. data/app/models/humpyard/elements/box_element.rb +15 -0
  14. data/app/models/humpyard/elements/media_element.rb +13 -0
  15. data/app/models/humpyard/elements/news_element.rb +13 -0
  16. data/app/models/humpyard/elements/sitemap_element.rb +11 -0
  17. data/app/models/humpyard/elements/text_element.rb +49 -0
  18. data/app/models/humpyard/news_item.rb +42 -0
  19. data/app/models/humpyard/page.rb +153 -0
  20. data/app/models/humpyard/pages/news_page.rb +71 -0
  21. data/app/models/humpyard/pages/static_page.rb +25 -0
  22. data/app/models/humpyard/pages/virtual_page.rb +30 -0
  23. data/app/views/humpyard/assets/_edit.html.haml +15 -0
  24. data/app/views/humpyard/assets/_index.html.haml +24 -0
  25. data/app/views/humpyard/assets/_list.html.haml +4 -0
  26. data/app/views/humpyard/assets/_list_item.html.haml +1 -0
  27. data/app/views/humpyard/assets/_show.html.haml +38 -0
  28. data/app/views/humpyard/assets/_show_asset.html.haml +3 -0
  29. data/app/views/humpyard/assets/destroy.js.erb +4 -0
  30. data/app/views/humpyard/assets/paperclip_assets/_edit.html.haml +4 -0
  31. data/app/views/humpyard/assets/paperclip_assets/_info_table.html.haml +10 -0
  32. data/app/views/humpyard/assets/paperclip_assets/_show.html.haml +12 -0
  33. data/app/views/humpyard/assets/youtube_assets/_edit.html.haml +4 -0
  34. data/app/views/humpyard/assets/youtube_assets/_show.html.haml +5 -0
  35. data/app/views/humpyard/common/_head.html.haml +8 -0
  36. data/app/views/humpyard/common/_page_construct.html.haml +45 -0
  37. data/app/views/humpyard/elements/_edit.html.haml +25 -0
  38. data/app/views/humpyard/elements/_inline_edit.haml +0 -0
  39. data/app/views/humpyard/elements/_new.html.haml +1 -0
  40. data/app/views/humpyard/elements/_show.html.haml +29 -0
  41. data/app/views/humpyard/elements/_show_container.html.haml +3 -0
  42. data/app/views/humpyard/elements/_show_view.html.haml +2 -0
  43. data/app/views/humpyard/elements/box_elements/_edit.html.haml +4 -0
  44. data/app/views/humpyard/elements/box_elements/_inline_edit.html.haml +0 -0
  45. data/app/views/humpyard/elements/box_elements/_show.html.haml +5 -0
  46. data/app/views/humpyard/elements/destroy.js.erb +1 -0
  47. data/app/views/humpyard/elements/error.js.erb +1 -0
  48. data/app/views/humpyard/elements/media_elements/_edit.html.haml +7 -0
  49. data/app/views/humpyard/elements/media_elements/_show.html.haml +8 -0
  50. data/app/views/humpyard/elements/news_elements/_edit.html.haml +5 -0
  51. data/app/views/humpyard/elements/news_elements/_inline_edit.html.haml +0 -0
  52. data/app/views/humpyard/elements/news_elements/_show.html.haml +4 -0
  53. data/app/views/humpyard/elements/sitemap_elements/_edit.html.haml +5 -0
  54. data/app/views/humpyard/elements/sitemap_elements/_inline_edit.html.haml +0 -0
  55. data/app/views/humpyard/elements/sitemap_elements/_show.html.haml +3 -0
  56. data/app/views/humpyard/elements/sitemap_elements/_show_part.html.haml +12 -0
  57. data/app/views/humpyard/elements/text_elements/_edit.html.haml +4 -0
  58. data/app/views/humpyard/elements/text_elements/_inline_edit.html.haml +0 -0
  59. data/app/views/humpyard/elements/text_elements/_show.html.haml +4 -0
  60. data/app/views/humpyard/pages/_content.html.haml +2 -0
  61. data/app/views/humpyard/pages/_edit.html.haml +39 -0
  62. data/app/views/humpyard/pages/_index.html.haml +23 -0
  63. data/app/views/humpyard/pages/_show.html.haml +16 -0
  64. data/app/views/humpyard/pages/_subtree.html.haml +6 -0
  65. data/app/views/humpyard/pages/_tree.html.haml +3 -0
  66. data/app/views/humpyard/pages/destroy.js.erb +4 -0
  67. data/app/views/humpyard/pages/news_pages/_detail.html.haml +10 -0
  68. data/app/views/humpyard/pages/news_pages/_edit.html.haml +3 -0
  69. data/app/views/humpyard/pages/news_pages/_show.html.haml +5 -0
  70. data/app/views/humpyard/pages/show.html.haml +3 -0
  71. data/app/views/humpyard/pages/static_pages/_edit.html.haml +1 -0
  72. data/app/views/humpyard/pages/static_pages/_show.html.haml +1 -0
  73. data/app/views/humpyard/pages/virtual_pages/_edit.html.haml +7 -0
  74. data/app/views/humpyard/pages/virtual_pages/_show.html.haml +4 -0
  75. data/app/views/humpyard/pages/welcome.html.haml +13 -0
  76. data/compass/stylesheets/_humpyard.scss +12 -0
  77. data/compass/stylesheets/humpyard/_backend.scss +1 -0
  78. data/compass/stylesheets/humpyard/_base.scss +144 -0
  79. data/compass/stylesheets/humpyard/_ie.scss +1 -0
  80. data/compass/stylesheets/humpyard/_jquery_ui_overrides.scss +380 -0
  81. data/compass/stylesheets/humpyard/_print.scss +3 -0
  82. data/config/locales/de.yml +84 -0
  83. data/config/locales/en.yml +81 -0
  84. data/config/routes.rb +38 -0
  85. data/db/migrate/20100321134138_base.rb +60 -0
  86. data/db/migrate/20100330204700_create_box_element.rb +24 -0
  87. data/db/migrate/20100401153655_page_template.rb +11 -0
  88. data/db/migrate/20100409195732_page_types.rb +26 -0
  89. data/db/migrate/20100413230623_element_yield.rb +14 -0
  90. data/db/migrate/20100415132312_news_page.rb +48 -0
  91. data/db/migrate/20100415193423_page_i18n_name.rb +27 -0
  92. data/db/migrate/20100415213700_create_news_element.rb +12 -0
  93. data/db/migrate/20100703120000_shared_elements.rb +9 -0
  94. data/db/migrate/20101001142534_page_modified_at.rb +11 -0
  95. data/db/migrate/20101003100138_create_sitemap_elements.rb +13 -0
  96. data/db/migrate/20101003122108_create_humpyard_pages_virtual_pages.rb +11 -0
  97. data/db/migrate/20101006070503_page_cache_control.rb +9 -0
  98. data/db/migrate/20101104173743_create_media.rb +36 -0
  99. data/db/migrate/20110425230524_media_with_link.rb +9 -0
  100. data/lib/generators/humpyard.rb +114 -0
  101. data/lib/generators/humpyard/auth/auth_generator.rb +191 -0
  102. data/lib/generators/humpyard/auth/templates/authlogic/README +9 -0
  103. data/lib/generators/humpyard/auth/templates/authlogic/controllers/user_sessions_controller.rb +22 -0
  104. data/lib/generators/humpyard/auth/templates/authlogic/migration.rb +17 -0
  105. data/lib/generators/humpyard/auth/templates/authlogic/models/ability.rb +12 -0
  106. data/lib/generators/humpyard/auth/templates/authlogic/models/user.rb +7 -0
  107. data/lib/generators/humpyard/auth/templates/authlogic/models/user_session.rb +6 -0
  108. data/lib/generators/humpyard/auth/templates/authlogic/views/user_sessions/new.html.haml +12 -0
  109. data/lib/generators/humpyard/auth/templates/custom/README +8 -0
  110. data/lib/generators/humpyard/auth/templates/devise/README +14 -0
  111. data/lib/generators/humpyard/auth/templates/devise/models/ability.rb +14 -0
  112. data/lib/generators/humpyard/auth/templates/fake/README +0 -0
  113. data/lib/generators/humpyard/auth/templates/fake/models/ability.rb +12 -0
  114. data/lib/generators/humpyard/auth/templates/simple/README +16 -0
  115. data/lib/generators/humpyard/auth/templates/simple/config/humpyard_users.yml +2 -0
  116. data/lib/generators/humpyard/auth/templates/simple/controllers/user_sessions_controller.rb +39 -0
  117. data/lib/generators/humpyard/auth/templates/simple/models/ability.rb +12 -0
  118. data/lib/generators/humpyard/auth/templates/simple/views/user_sessions/new.html.haml +15 -0
  119. data/lib/generators/humpyard/element/USAGE +7 -0
  120. data/lib/generators/humpyard/element/element_generator.rb +82 -0
  121. data/lib/generators/humpyard/element/templates/_edit.html.haml +12 -0
  122. data/lib/generators/humpyard/element/templates/_inline_edit.html.haml +0 -0
  123. data/lib/generators/humpyard/element/templates/_show.html.haml +9 -0
  124. data/lib/generators/humpyard/element/templates/fixtures.yml +23 -0
  125. data/lib/generators/humpyard/element/templates/migration.rb +16 -0
  126. data/lib/generators/humpyard/element/templates/model.rb +11 -0
  127. data/lib/generators/humpyard/element/templates/tests/rspec/model.rb +7 -0
  128. data/lib/generators/humpyard/element/templates/tests/shoulda/model.rb +7 -0
  129. data/lib/generators/humpyard/element/templates/tests/test_unit/model.rb +7 -0
  130. data/lib/generators/humpyard/page/USAGE +7 -0
  131. data/lib/generators/humpyard/page/page_generator.rb +80 -0
  132. data/lib/generators/humpyard/page/templates/_edit.html.haml +7 -0
  133. data/lib/generators/humpyard/page/templates/_show.html.haml +4 -0
  134. data/lib/generators/humpyard/page/templates/fixtures.yml +23 -0
  135. data/lib/generators/humpyard/page/templates/migration.rb +16 -0
  136. data/lib/generators/humpyard/page/templates/model.rb +37 -0
  137. data/lib/generators/humpyard/page/templates/tests/rspec/model.rb +7 -0
  138. data/lib/generators/humpyard/page/templates/tests/shoulda/model.rb +7 -0
  139. data/lib/generators/humpyard/page/templates/tests/test_unit/model.rb +7 -0
  140. data/lib/generators/humpyard/skeleton/USAGE +6 -0
  141. data/lib/generators/humpyard/skeleton/skeleton_generator.rb +99 -0
  142. data/lib/generators/humpyard/skeleton/templates/compass.config +14 -0
  143. data/lib/generators/humpyard/skeleton/templates/images/ajax-loader.gif +0 -0
  144. data/lib/generators/humpyard/skeleton/templates/images/grid.png +0 -0
  145. data/lib/generators/humpyard/skeleton/templates/initializers/compass.rb +16 -0
  146. data/lib/generators/humpyard/skeleton/templates/initializers/haml.rb +3 -0
  147. data/lib/generators/humpyard/skeleton/templates/initializers/humpyard.rb +20 -0
  148. data/lib/generators/humpyard/skeleton/templates/javascripts/jquery-ui-18/images/jstree/d.png +0 -0
  149. data/lib/generators/humpyard/skeleton/templates/javascripts/jquery-ui-18/images/jstree/throbber.gif +0 -0
  150. data/lib/generators/humpyard/skeleton/templates/javascripts/jquery-ui-18/javascripts/jquery-1.5.1.js +8316 -0
  151. data/lib/generators/humpyard/skeleton/templates/javascripts/jquery-ui-18/javascripts/jquery-humpyard.js +790 -0
  152. data/lib/generators/humpyard/skeleton/templates/javascripts/jquery-ui-18/javascripts/jquery-rails.js +157 -0
  153. data/lib/generators/humpyard/skeleton/templates/javascripts/jquery-ui-18/javascripts/jquery-ui-1.8.10.js +11544 -0
  154. data/lib/generators/humpyard/skeleton/templates/javascripts/jquery-ui-18/javascripts/jquery.form-2.64.js +803 -0
  155. data/lib/generators/humpyard/skeleton/templates/javascripts/jquery-ui-18/javascripts/jquery.jstree.js +3510 -0
  156. data/lib/generators/humpyard/skeleton/templates/javascripts/jquery-ui-18/stylesheets/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  157. data/lib/generators/humpyard/skeleton/templates/javascripts/jquery-ui-18/stylesheets/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  158. data/lib/generators/humpyard/skeleton/templates/javascripts/jquery-ui-18/stylesheets/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  159. data/lib/generators/humpyard/skeleton/templates/javascripts/jquery-ui-18/stylesheets/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  160. data/lib/generators/humpyard/skeleton/templates/javascripts/jquery-ui-18/stylesheets/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  161. data/lib/generators/humpyard/skeleton/templates/javascripts/jquery-ui-18/stylesheets/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  162. data/lib/generators/humpyard/skeleton/templates/javascripts/jquery-ui-18/stylesheets/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  163. data/lib/generators/humpyard/skeleton/templates/javascripts/jquery-ui-18/stylesheets/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  164. data/lib/generators/humpyard/skeleton/templates/javascripts/jquery-ui-18/stylesheets/smoothness/images/ui-icons_222222_256x240.png +0 -0
  165. data/lib/generators/humpyard/skeleton/templates/javascripts/jquery-ui-18/stylesheets/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  166. data/lib/generators/humpyard/skeleton/templates/javascripts/jquery-ui-18/stylesheets/smoothness/images/ui-icons_454545_256x240.png +0 -0
  167. data/lib/generators/humpyard/skeleton/templates/javascripts/jquery-ui-18/stylesheets/smoothness/images/ui-icons_888888_256x240.png +0 -0
  168. data/lib/generators/humpyard/skeleton/templates/javascripts/jquery-ui-18/stylesheets/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  169. data/lib/generators/humpyard/skeleton/templates/javascripts/jquery-ui-18/stylesheets/smoothness/jquery-ui-1.8.10.css +573 -0
  170. data/lib/generators/humpyard/skeleton/templates/stylesheets/ie.sass +15 -0
  171. data/lib/generators/humpyard/skeleton/templates/stylesheets/ie.scss +16 -0
  172. data/lib/generators/humpyard/skeleton/templates/stylesheets/partials/_base.sass +12 -0
  173. data/lib/generators/humpyard/skeleton/templates/stylesheets/partials/_base.scss +11 -0
  174. data/lib/generators/humpyard/skeleton/templates/stylesheets/print.sass +3 -0
  175. data/lib/generators/humpyard/skeleton/templates/stylesheets/print.scss +3 -0
  176. data/lib/generators/humpyard/skeleton/templates/stylesheets/screen.sass +78 -0
  177. data/lib/generators/humpyard/skeleton/templates/stylesheets/screen.scss +90 -0
  178. data/lib/generators/humpyard/skeleton/templates/views/layout.html.haml +28 -0
  179. data/lib/html_to_textile.rb +220 -0
  180. data/lib/humpyard.rb +70 -0
  181. data/lib/humpyard/action_controller/base.rb +24 -0
  182. data/lib/humpyard/active_model/naming.rb +29 -0
  183. data/lib/humpyard/active_model/translation.rb +26 -0
  184. data/lib/humpyard/active_model/validators/publish_range.rb +14 -0
  185. data/lib/humpyard/active_record/acts/asset.rb +68 -0
  186. data/lib/humpyard/active_record/acts/container_element.rb +26 -0
  187. data/lib/humpyard/active_record/acts/element.rb +89 -0
  188. data/lib/humpyard/active_record/acts/page.rb +101 -0
  189. data/lib/humpyard/active_record/has/title_for_url.rb +75 -0
  190. data/lib/humpyard/compass.rb +6 -0
  191. data/lib/humpyard/config.rb +235 -0
  192. data/lib/humpyard/engine.rb +7 -0
  193. data/lib/humpyard/uri_parser.rb +16 -0
  194. data/lib/humpyard/uri_parser/assets_uri_parser.rb +15 -0
  195. data/lib/humpyard/uri_parser/pages_uri_parser.rb +15 -0
  196. data/lib/tasks/humpyard.rake +103 -0
  197. metadata +331 -0
data/Gemfile ADDED
@@ -0,0 +1,28 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gem "rails", '>=3.0.0'
4
+ gem 'builder'
5
+ gem 'haml', '>=3.0.0'
6
+ gem 'compass', '>=0.10.0'
7
+ gem 'acts_as_tree', '>=0.1.1'
8
+ gem 'cancan', '>=1.6.4'
9
+ gem 'globalize3', '>=0.0.7'
10
+ gem 'humpyard_form', :git => 'http://github.com/humpyard/humpyard_form.git'
11
+
12
+ group :test do
13
+ gem 'test-unit'
14
+ gem 'rspec-rails', '>=2.0.0.beta.22'
15
+ gem 'capybara', '>=0.3.7'
16
+ gem 'database_cleaner', '>=0.5.2'
17
+ gem 'cucumber', '>=0.8.5'
18
+ gem 'cucumber-rails', '>=0.3.2'
19
+ gem 'pickle', '>=0.4.2'
20
+ gem 'factory_girl', '>=1.3.2'
21
+ gem 'markup_validity', '>=1.1.0'
22
+ gem 'sqlite3-ruby', :require => 'sqlite3'
23
+ gem 'thin'
24
+ end
25
+
26
+ if RUBY_VERSION < '1.9'
27
+ gem 'ruby-debug', '>=0.10.3'
28
+ end
@@ -0,0 +1,61 @@
1
+ = humpyard
2
+
3
+ Humpyard is a CMS in a gem for Rails 3.
4
+
5
+ == Installation
6
+
7
+ * Add Humpyard to your Rails application's Gemfile. It does require edge rails at the moment.
8
+ gem "rails", '>=3.0.0'
9
+ gem 'builder'
10
+ gem 'haml', '>=3.0.0'
11
+ gem 'compass', '>=0.10.0'
12
+ gem 'acts_as_tree', '>=0.1.1'
13
+ gem 'cancan', '>=1.3.4'
14
+ gem 'globalize3', '>=0.0.7'
15
+ gem 'humpyard_form', '>=0.0.4'
16
+ gem 'humpyard', :git => 'git://github.com/humpyard/humpyard.git'
17
+
18
+ * If you want to use textil syntax on TextElements also add RedCloth to the Gemfile.
19
+ gem 'RedCloth', '>=4.2.3'
20
+
21
+ * Change into your Rails application's directory
22
+
23
+ * Generate Humpyard skeleton
24
+ rails generate humpyard:skeleton
25
+ A full documentation of options for creating a humpyard skeleton can be
26
+ found at the Humpyard::Generators::ElementGenerator section of this documentation.
27
+
28
+ * Use an Auth Framework
29
+
30
+ rails generate humpyard:auth
31
+ At the moment there is only a fake user framework for toggling if the admin-user
32
+ is logged in or not. There are going to be generators for both, Authlogic and Devise,
33
+ as soon as we get those to work with edge Rails.
34
+
35
+ As the abilities in Humpyard are defined by CanCan, it should be possible to use any
36
+ auth framework to authentice your users.
37
+
38
+ * Migrate the Humpyard database tables
39
+ rake humpyard:db:migrate
40
+
41
+ * Create an initial root page (recommended)
42
+ rake humpyard:pages:create_root
43
+
44
+ == API Documentation
45
+
46
+ * API Documentation can be created by running
47
+ rake rdoc
48
+ from the humpyard project directory.
49
+ * There is an auto-generated, up-to-the-hour online_documentation[http://humpyard.org/rdoc] of the API Documentation.
50
+
51
+ == Note on Patches/Pull Requests
52
+
53
+ * Fork the project.
54
+ * Make your feature addition or bug fix.
55
+ * Add tests for it. No discussion. No tests, no game. We use rspec and cucumber with associated addons.
56
+ * Commit, do not mess with rakefile, version, or history. If you want to have your own version, thats fine. But bump your version in a seperate commit that can be ignored when pulling.
57
+ * Send me a pull request. Bonus points for topic branches.
58
+
59
+ == Copyright
60
+
61
+ Copyright (c) 2010 Sven G. Brönstrup. See LICENSE for details.
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
@@ -0,0 +1,123 @@
1
+ module Humpyard
2
+ class AssetsController < ::ApplicationController
3
+ def index
4
+ @assets = Humpyard::Asset.all
5
+
6
+ render :partial => 'index'
7
+ end
8
+
9
+ def new
10
+ @asset = Humpyard::config.asset_types[params[:type]].new()
11
+
12
+ authorize! :create, @asset.asset
13
+
14
+ @asset_type = params[:type]
15
+
16
+ render :partial => 'edit'
17
+ end
18
+
19
+ def create
20
+ @asset = Humpyard::config.asset_types[params[:type]].new params[:asset]
21
+
22
+ unless can? :create, @asset.asset
23
+ render :json => {
24
+ :status => :failed
25
+ }, :status => 403
26
+ return
27
+ end
28
+
29
+ if @asset.save
30
+ @assets = Humpyard::Asset.all
31
+ render :json => {
32
+ :status => :ok,
33
+ :replace => [{
34
+ :element => "hy-asset-listview",
35
+ :content => render_to_string(:partial => "list.html", :locals => {:assets => @assets, :asset => @asset})
36
+ }],
37
+ :flash => {
38
+ :level => 'info',
39
+ :content => I18n.t('humpyard_form.flashes.create_success', :model => Humpyard::Asset.model_name.human)
40
+ }
41
+ }
42
+ else
43
+ render :json => {
44
+ :status => :failed,
45
+ :errors => @asset.errors,
46
+ :flash => {
47
+ :level => 'error',
48
+ :content => I18n.t('humpyard_form.flashes.create_fail', :model => Humpyard::Asset.model_name.human)
49
+ }
50
+ }
51
+ end
52
+ end
53
+
54
+ def edit
55
+ @asset = Humpyard::Asset.find(params[:id]).content_data
56
+
57
+ authorize! :update, @asset.asset
58
+
59
+ render :partial => 'edit'
60
+ end
61
+
62
+ def update
63
+ @asset = Humpyard::Asset.find(params[:id])
64
+ if @asset
65
+ unless can? :update, @asset
66
+ render :json => {
67
+ :status => :failed
68
+ }, :status => 403
69
+ return
70
+ end
71
+
72
+ if @asset.content_data.update_attributes params[:asset]
73
+ render :json => {
74
+ :status => :ok,
75
+ :replace => [
76
+ {
77
+ :element => "hy-asset-listview-text-#{@asset.id}",
78
+ :content => render_to_string(:partial =>'list_item.html', :locals => {:asset => @asset, :active => true})
79
+ }
80
+ ],
81
+ :flash => {
82
+ :level => 'info',
83
+ :content => I18n.t('humpyard_form.flashes.update_success', :model => Humpyard::Asset.model_name.human)
84
+ }
85
+ }
86
+ else
87
+ render :json => {
88
+ :status => :failed,
89
+ :errors => @asset.content_data.errors,
90
+ :flash => {
91
+ :level => 'error',
92
+ :content => I18n.t('humpyard_form.flashes.update_fail', :model => Humpyard::Asset.model_name.human)
93
+ }
94
+ }
95
+ end
96
+ else
97
+ render :json => {
98
+ :status => :failed,
99
+ :flash => {
100
+ :level => 'error',
101
+ :content => I18n.t('humpyard_form.flashes.not_found', :model => Humpyard::Asset.model_name.human)
102
+ }
103
+ }, :status => 404
104
+ end
105
+ end
106
+
107
+ def show
108
+ @asset = Humpyard::Asset.find(params[:id]).content_data
109
+
110
+ authorize! :show, @asset.asset
111
+
112
+ render :partial => 'show'
113
+ end
114
+
115
+ def destroy
116
+ @asset = Humpyard::Asset.find(params[:id])
117
+
118
+ authorize! :destroy, @asset
119
+
120
+ @asset.destroy
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,200 @@
1
+ module Humpyard
2
+ ####
3
+ # Humpyard::ElementController is the controller for editing your elements
4
+ class ElementsController < ::ApplicationController
5
+
6
+ # Dialog content for a new element
7
+ def new
8
+ @element = Humpyard::config.element_types[params[:type]].new(
9
+ :page_id => params[:page_id],
10
+ :container_id => params[:container_id].to_i > 0 ? params[:container_id].to_i : nil,
11
+ :page_yield_name => params[:yield_name].blank? ? 'main' : params[:yield_name],
12
+ :shared_state => 0)
13
+
14
+ authorize! :create, @element.element
15
+
16
+ @element_type = params[:type]
17
+ @prev = Humpyard::Element.find_by_id(params[:prev_id])
18
+ @next = Humpyard::Element.find_by_id(params[:next_id])
19
+
20
+ render :partial => 'edit'
21
+ end
22
+
23
+ # Create a new element
24
+ def create
25
+ @element = Humpyard::config.element_types[params[:type]].new params[:element]
26
+
27
+ unless can? :create, @element.element
28
+ render :json => {
29
+ :status => :failed
30
+ }, :status => 403
31
+ return
32
+ end
33
+
34
+ if @element.save
35
+ @prev = Humpyard::Element.find_by_id(params[:prev_id])
36
+ @next = Humpyard::Element.find_by_id(params[:next_id])
37
+
38
+ do_move(@element, @prev, @next)
39
+
40
+ insert_options = {
41
+ :element => "hy-id-#{@element.element.id}",
42
+ :url => humpyard_element_path(@element.element),
43
+ :parent => @element.container ? "hy-id-#{@element.container.id}" : "hy-content-#{@element.page_yield_name}"
44
+ }
45
+
46
+ insert_options[:before] = "hy-id-#{@next.id}" if @next
47
+ insert_options[:after] = "hy-id-#{@prev.id}" if not @next and @prev
48
+
49
+ render :json => {
50
+ :status => :ok,
51
+ :dialog => :close,
52
+ :insert => [insert_options]
53
+ }
54
+ else
55
+ render :json => {
56
+ :status => :failed,
57
+ :errors => @element.errors
58
+ }
59
+ end
60
+ end
61
+
62
+ # Inline edit content for an existing element
63
+ def inline_edit
64
+ @element = Humpyard::Element.find(params[:id]).content_data
65
+
66
+ authorize! :update, @element.element
67
+
68
+ render :partial => 'inline_edit'
69
+ end
70
+
71
+ # Dialog content for an existing element
72
+ def edit
73
+ @element = Humpyard::Element.find(params[:id]).content_data
74
+
75
+ authorize! :update, @element.element
76
+
77
+ render :partial => 'edit'
78
+ end
79
+
80
+ # Update an existing element
81
+ def update
82
+ @element = Humpyard::Element.find(params[:id])
83
+ if @element
84
+ unless can? :update, @element
85
+ render :json => {
86
+ :status => :failed
87
+ }, :status => 403
88
+ return
89
+ end
90
+
91
+ if @element.content_data.update_attributes params[:element]
92
+ render :json => {
93
+ :status => :ok,
94
+ :dialog => :close,
95
+ :replace => [
96
+ {
97
+ :element => "hy-id-#{@element.id}",
98
+ :url => humpyard_element_path(@element)
99
+ }
100
+ ]
101
+ }
102
+ else
103
+ render :json => {
104
+ :status => :failed,
105
+ :errors => @element.content_data.errors
106
+ }
107
+ end
108
+ else
109
+ render :json => {
110
+ :status => :failed
111
+ }, :status => 404
112
+ end
113
+ end
114
+
115
+ # Move an element
116
+ def move
117
+ @element = Humpyard::Element.find(params[:id])
118
+
119
+ if @element
120
+ unless can? :update, @element
121
+ render :json => {
122
+ :status => :failed
123
+ }, :status => 403
124
+ return
125
+ end
126
+
127
+ @element.update_attributes(
128
+ :container => Humpyard::Element.find_by_id(params[:container_id]),
129
+ :page_yield_name => params[:yield_name]
130
+ )
131
+ @prev = Humpyard::Element.find_by_id(params[:prev_id])
132
+ @next = Humpyard::Element.find_by_id(params[:next_id])
133
+
134
+ do_move(@element, @prev, @next)
135
+
136
+ render :json => {
137
+ :status => :ok
138
+ }
139
+ else
140
+ render :json => {
141
+ :status => :failed
142
+ }, :status => 404
143
+ end
144
+ end
145
+
146
+ # Destroy an element
147
+ def destroy
148
+ @element = Humpyard::Element.find_by_id(params[:id])
149
+
150
+ if can? :destroy, @element
151
+ @element.destroy
152
+ else
153
+ @error = "You have no permission to delete this element (id: #{@element.class}:#{params[:id]})"
154
+ render :error
155
+ end
156
+ end
157
+
158
+ # Render a given element
159
+ def show
160
+ @element = Humpyard::Element.find(params[:id])
161
+
162
+ authorize! :read, @element
163
+
164
+ render :partial => 'show', :locals => {:element => @element}
165
+ end
166
+
167
+ private
168
+ def do_move(element, prev_element, next_element) #:nodoc#
169
+ if element.container
170
+ neighbours = element.container.elements
171
+ else
172
+ neighbours = element.page.root_elements(element.page_yield_name)
173
+ end
174
+
175
+ #p "before #{next_id} and after #{prev_id}"
176
+ p "page_yield: #{element.page_yield_name}"
177
+
178
+ position = 0
179
+ neighbours.each do |el|
180
+ if next_element == el
181
+ p "insert element #{element.id} before #{el.id}"
182
+ element.update_attribute :position, position
183
+ position += 1
184
+ end
185
+ if element != el
186
+ p "process #{el.id} to position #{position}"
187
+ el.update_attribute :position, position unless element.position == position
188
+ end
189
+ if not next_element and prev_element == el
190
+ p "insert element #{element.id} after #{el.id}"
191
+ position += 1
192
+ element.update_attribute :position, position
193
+ end
194
+ if element != el
195
+ position += 1
196
+ end
197
+ end
198
+ end
199
+ end
200
+ end
@@ -0,0 +1,8 @@
1
+ # coding: utf-8
2
+ class Humpyard::ErrorsController < ApplicationController
3
+ helper 'humpyard::pages'
4
+
5
+ def error404
6
+ raise ActionController::RoutingError, "No route matches \"#{request.path}\""
7
+ end
8
+ end
@@ -0,0 +1,365 @@
1
+ module Humpyard
2
+ ####
3
+ # Humpyard::PagesController is the controller for editing and viewing pages
4
+ class PagesController < ::ApplicationController
5
+ helper 'humpyard::pages'
6
+
7
+ # Probably unneccassary - may be removed later
8
+ def index
9
+ authorize! :manage, Humpyard::Page
10
+
11
+ @root_page = Humpyard::Page.root
12
+ @page = Humpyard::Page.find_by_id(params[:actual_page_id])
13
+
14
+ unless @page.nil?
15
+ @page = @page.content_data
16
+ end
17
+ render :partial => 'index'
18
+ end
19
+
20
+ # Dialog content for a new page
21
+ def new
22
+ @page = Humpyard::config.page_types[params[:type]].new
23
+
24
+ unless can? :create, @page.page
25
+ render :json => {
26
+ :status => :failed
27
+ }, :status => 403
28
+ return
29
+ end
30
+
31
+ @page_type = params[:type]
32
+ @prev = Humpyard::Page.find_by_id(params[:prev_id])
33
+ @next = Humpyard::Page.find_by_id(params[:next_id])
34
+
35
+ render :partial => 'edit'
36
+ end
37
+
38
+ # Create a new page
39
+ def create
40
+ @page = Humpyard::config.page_types[params[:type]].new params[:page]
41
+ @page.title_for_url = @page.page.suggested_title_for_url
42
+
43
+ authorize! :create, @page.page
44
+
45
+ if @page.save
46
+ @prev = Humpyard::Page.find_by_id(params[:prev_id])
47
+ @next = Humpyard::Page.find_by_id(params[:next_id])
48
+
49
+ #do_move(@page, @prev, @next)
50
+
51
+ # insert_options = {
52
+ # :element => "hy-id-#{@page.id}",
53
+ # :url => @page.page.human_url,
54
+ # :parent => @page.parent ? "hy-page-dialog-item-#{@page.id}" : "hy-page-dialog-pages"
55
+ # }
56
+
57
+ # insert_options[:before] = "hy-page-dialog-item-#{@next.id}" if @next
58
+ # insert_options[:after] = "hy-page-dialog-item-#{@prev.id}" if not @next and @prev
59
+
60
+ # just reload the tree
61
+
62
+ replace_options = {
63
+ :element => "hy-page-treeview",
64
+ :content => render_to_string(:partial => "tree.html", :locals => {:page => @page})
65
+ }
66
+
67
+ render :json => {
68
+ :status => :ok,
69
+ #:dialog => :close,
70
+ # :insert => [insert_options],
71
+ :replace => [replace_options],
72
+ :flash => {
73
+ :level => 'info',
74
+ :content => I18n.t('humpyard_form.flashes.create_success', :model => Humpyard::Page.model_name.human)
75
+ }
76
+ }
77
+ else
78
+ render :json => {
79
+ :status => :failed,
80
+ :errors => @page.errors,
81
+ :flash => {
82
+ :level => 'error',
83
+ :content => I18n.t('humpyard_form.flashes.create_fail', :model => Humpyard::Page.model_name.human)
84
+ }
85
+ }
86
+ end
87
+ end
88
+
89
+ # Dialog content for an existing page
90
+ def edit
91
+ @page = Humpyard::Page.find(params[:id]).content_data
92
+
93
+ authorize! :update, @page.page
94
+
95
+ render :partial => 'edit'
96
+ end
97
+
98
+ # Update an existing page
99
+ def update
100
+ @page = Humpyard::Page.find(params[:id]).content_data
101
+
102
+ if @page
103
+ unless can? :update, @page.page
104
+ render :json => {
105
+ :status => :failed
106
+ }, :status => 403
107
+ return
108
+ end
109
+
110
+ if @page.update_attributes params[:page]
111
+ @page.title_for_url = @page.page.suggested_title_for_url
112
+ @page.save
113
+ render :json => {
114
+ :status => :ok,
115
+ # :dialog => :close,
116
+ :replace => [
117
+ {
118
+ :element => "hy-page-treeview-text-#{@page.id}",
119
+ :content => @page.title
120
+ }
121
+ ],
122
+ :flash => {
123
+ :level => 'info',
124
+ :content => I18n.t('humpyard_form.flashes.update_success', :model => Humpyard::Page.model_name.human)
125
+ }
126
+ }
127
+ else
128
+ render :json => {
129
+ :status => :failed,
130
+ :errors => @page.errors,
131
+ :flash => {
132
+ :level => 'error',
133
+ :content => I18n.t('humpyard_form.flashes.update_fail', :model => Humpyard::Page.model_name.human)
134
+ }
135
+ }
136
+ end
137
+ else
138
+ render :json => {
139
+ :status => :failed
140
+ }, :status => 404
141
+ end
142
+
143
+ end
144
+
145
+ # Move a page
146
+ def move
147
+ @page = Humpyard::Page.find(params[:id])
148
+
149
+ if @page
150
+ unless can? :update, @page
151
+ render :json => {
152
+ :status => :failed
153
+ }, :status => 403
154
+ return
155
+ end
156
+
157
+ parent = Humpyard::Page.find_by_id(params[:parent_id])
158
+ # by default, make it possible to move page to root, uncomment to do otherwise:
159
+ #unless parent
160
+ # parent = Humpyard::Page.root_page
161
+ #end
162
+ @page.update_attribute :parent, parent
163
+ @prev = Humpyard::Page.find_by_id(params[:prev_id])
164
+ @next = Humpyard::Page.find_by_id(params[:next_id])
165
+
166
+ do_move(@page, @prev, @next)
167
+
168
+ replace_options = {
169
+ :element => "hy-page-treeview",
170
+ :content => render_to_string(:partial => "tree.html", :locals => {:page => @page})
171
+ }
172
+
173
+ render :json => {
174
+ :status => :ok,
175
+ :replace => [replace_options]
176
+ }
177
+ else
178
+ render :json => {
179
+ :status => :failed
180
+ }, :status => 404
181
+ end
182
+ end
183
+
184
+ # Destroy a page
185
+ def destroy
186
+ @page = Humpyard::Page.find(params[:id])
187
+
188
+ authorize! :destroy, @page
189
+
190
+ @page.destroy
191
+ end
192
+
193
+
194
+ # Render a given page
195
+ #
196
+ # When a "webpath" parameter is given it will render the page with that name.
197
+ # This is what happens when you call a page with it's pretty URL.
198
+ #
199
+ # When no "name" is given and an "id" parameter is given it will render the
200
+ # page with the given id.
201
+ #
202
+ # When no "name" nor "id" parameter is given it will render the root page.
203
+ def show
204
+ # No page found at the beginning
205
+ @page = nil
206
+
207
+ if params[:locale] and Humpyard.config.locales.include? params[:locale].to_sym
208
+ I18n.locale = params[:locale]
209
+ elsif session[:humpyard_locale]
210
+ I18n.locale = session[:humpyard_locale]
211
+ else
212
+ I18n.locale = Humpyard.config.locales.first
213
+ end
214
+
215
+ # Find page by name
216
+ if not params[:webpath].blank?
217
+ dyn_page_path = false
218
+ parent_page = nil
219
+ params[:webpath].split('/').each do |path_part|
220
+ # Ignore multiple slashes in URLs
221
+ unless(path_part.blank?)
222
+ if(dyn_page_path)
223
+ dyn_page_path << path_part
224
+ else
225
+ # Find page by name and parent; parent=nil means page on root level
226
+ @page = Page.with_translated_attribute(:title_for_url, CGI::escape(path_part), I18n.locale).first
227
+ # Raise 404 if no page was found for the URL or subpart
228
+ raise ::ActionController::RoutingError, "No route matches \"#{request.path}\" (X4201) [#{path_part}]" if @page.nil?
229
+ raise ::ActionController::RoutingError, "No route matches \"#{request.path}\" (X4202)" if not (@page.parent == parent_page or @page.parent == Humpyard::Page.root_page)
230
+
231
+ parent_page = @page unless @page.is_root_page?
232
+ dyn_page_path = [] if @page.content_data.is_humpyard_dynamic_page?
233
+ end
234
+ end
235
+ end
236
+
237
+ if @page.content_data.is_humpyard_dynamic_page? and dyn_page_path.size > 0
238
+ @sub_page = @page.parse_path(dyn_page_path)
239
+
240
+ # Raise 404 if no page was found for the sub_page part
241
+ raise ::ActionController::RoutingError, "No route matches \"#{request.path}\" (D4201)" if @sub_page.blank?
242
+
243
+ @page_partial = "/humpyard/pages/#{@page.content_data_type.split('::').last.underscore.pluralize}/#{@sub_page[:partial]}" if @sub_page[:partial]
244
+ @local_vars = {:page => @page}.merge(@sub_page[:locals]) if @sub_page[:locals] and @sub_page[:locals].class == Hash
245
+
246
+ # render partial only if request was an AJAX-call
247
+ if request.xhr?
248
+ respond_to do |format|
249
+ format.html {
250
+ render :partial => @page_partial, :locals => @local_vars
251
+ }
252
+ end
253
+ return
254
+ end
255
+ end
256
+
257
+ # Find page by id
258
+ elsif not params[:id].blank?
259
+ # Render page by id if not webpath was given but an id
260
+ @page = Page.find(params[:id])
261
+ # Find root page
262
+ else
263
+ # Render index page if neither id or webpath was given
264
+ @page = Page.root_page :force_reload => true
265
+ unless @page
266
+ @page = Page.new
267
+ render '/humpyard/pages/welcome'
268
+ return false
269
+ end
270
+ end
271
+
272
+ # Raise 404 if no page was found
273
+ raise ::ActionController::RoutingError, "No route matches \"#{request.path}\"" if @page.nil? or @page.content_data.is_humpyard_virtual_page?
274
+
275
+ response.headers['X-Humpyard-Page'] = "#{@page.id}"
276
+ response.headers['X-Humpyard-Modified'] = "#{@page.last_modified}"
277
+ response.headers['X-Humpyard-ServerTime'] = "#{Time.now.utc}"
278
+
279
+ @page_partial ||= "/humpyard/pages/#{@page.content_data_type.split('::').last.underscore.pluralize}/show"
280
+ @local_vars ||= {:page => @page}
281
+
282
+ self.class.layout(@page.template_name)
283
+
284
+ if Rails.application.config.action_controller.perform_caching and not @page.always_refresh
285
+ fresh_when :etag => "#{humpyard_user.nil? ? '' : humpyard_user}p#{@page.id}m#{@page.last_modified}", :last_modified => @page.last_modified(:include_pages => true), :public => @humpyard_user.nil?
286
+ end
287
+ end
288
+
289
+ # Render the sitemap.xml for robots
290
+ def sitemap
291
+ require 'builder'
292
+
293
+ xml = ::Builder::XmlMarkup.new :indent => 2
294
+ xml.instruct!
295
+ xml.tag! :urlset, {
296
+ 'xmlns'=>"http://www.sitemaps.org/schemas/sitemap/0.9",
297
+ 'xmlns:xsi'=>"http://www.w3.org/2001/XMLSchema-instance",
298
+ 'xsi:schemaLocation'=>"http://www.sitemaps.org/schemas/sitemap/0.9\nhttp://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"
299
+ } do
300
+
301
+ base_url = "#{request.protocol}#{request.host}#{request.port==80 ? '' : ":#{request.port}"}"
302
+
303
+ if root_page = Page.root_page
304
+ Humpyard.config.locales.each do |locale|
305
+ add_to_sitemap xml, base_url, locale, [{
306
+ :index => true,
307
+ :url => root_page.human_url(:locale => locale),
308
+ :lastmod => root_page.last_modified,
309
+ :children => []
310
+ }] + root_page.child_pages(:single_root => true).map{|p| p.content_data.site_map(locale)}
311
+ end
312
+ end
313
+ end
314
+ render :xml => xml.target!
315
+ end
316
+
317
+ private
318
+ def add_to_sitemap xml, base_url, locale, pages, priority=0.8, changefreq='daily'
319
+ pages.each do |page|
320
+ if page
321
+ unless page[:hidden]
322
+ xml.tag! :url do
323
+ xml.tag! :loc, "#{base_url}#{page[:url]}"
324
+ xml.tag! :lastmod, page[:lastmod].nil? ? nil : page[:lastmod].to_time.strftime("%FT%T%z").gsub(/00$/,':00')
325
+ xml.tag! :changefreq, page[:changefreq] ? page[:changefreq] : changefreq
326
+ xml.tag! :priority, page[:index] ? 1.0 : priority
327
+ end
328
+ end
329
+ add_to_sitemap xml, base_url, locale, page[:children], priority/2
330
+ end
331
+ end
332
+ end
333
+
334
+ def do_move(page, prev_page, next_page) #:nodoc#
335
+ if page.parent
336
+ neighbours = page.parent.child_pages
337
+ else
338
+ neighbours = Humpyard::Page.where('parent_id IS NULL')
339
+ end
340
+
341
+ #p "before #{next_id} and after #{prev_id}"
342
+
343
+ position = 0
344
+ neighbours.each do |p|
345
+ if next_page == p
346
+ puts "insert page #{page.id} before #{p.id}"
347
+ page.update_attribute :position, position
348
+ position += 1
349
+ end
350
+ if page != p
351
+ puts "process page #{p.id} to position #{position}"
352
+ p.update_attribute :position, position
353
+ end
354
+ if not next_page and prev_page == p
355
+ puts "insert page #{page.id} after #{p.id}"
356
+ position += 1
357
+ page.update_attribute :position, position
358
+ end
359
+ if page != p
360
+ position += 1
361
+ end
362
+ end
363
+ end
364
+ end
365
+ end