imagine_cms 3.0.0.beta6 → 3.0.0.beta7
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +1 -1
- data/app/assets/images/codepress/line-numbers.png +0 -0
- data/app/assets/images/cropper/marqueeHoriz.gif +0 -0
- data/app/assets/images/cropper/marqueeVert.gif +0 -0
- data/app/assets/images/management/btn_add.gif +0 -0
- data/app/assets/images/management/btn_archive.gif +0 -0
- data/app/assets/images/management/btn_delete.gif +0 -0
- data/app/assets/images/management/btn_duplicate.gif +0 -0
- data/app/assets/images/management/btn_edit.gif +0 -0
- data/app/assets/images/management/btn_help.gif +0 -0
- data/app/assets/images/management/btn_new_page.gif +0 -0
- data/app/assets/images/management/btn_preview.gif +0 -0
- data/app/assets/images/management/btn_properties.gif +0 -0
- data/app/assets/images/management/btn_restore.gif +0 -0
- data/app/assets/images/management/btn_top_delete.gif +0 -0
- data/app/assets/images/management/btn_top_duplicate.gif +0 -0
- data/app/assets/images/management/btn_top_edit.gif +0 -0
- data/app/assets/images/management/btn_top_new.gif +0 -0
- data/app/assets/images/management/btn_top_preview.gif +0 -0
- data/app/assets/images/management/btn_top_properties.gif +0 -0
- data/app/assets/{manage → images/management}/bullet.gif +0 -0
- data/app/assets/images/management/cvv2_graphic.gif +0 -0
- data/app/assets/images/management/error.gif +0 -0
- data/app/assets/images/management/gallery_index.gif +0 -0
- data/app/assets/images/management/gallery_preview_overlay.png +0 -0
- data/app/assets/images/management/gallery_small_drag_overlay.png +0 -0
- data/app/assets/images/management/gallery_small_overlay.png +0 -0
- data/app/assets/images/management/gallery_sort.gif +0 -0
- data/app/assets/images/management/icon_download.gif +0 -0
- data/app/assets/images/management/icon_locked.png +0 -0
- data/app/assets/images/management/icon_page.gif +0 -0
- data/app/assets/images/management/icon_time.gif +0 -0
- data/app/assets/images/management/icon_unlocked.png +0 -0
- data/app/assets/images/management/page_loading.gif +0 -0
- data/app/assets/{manage → images/management}/start.gif +0 -0
- data/app/assets/images/management/vcard.gif +0 -0
- data/app/assets/javascripts/builder.js +101 -0
- data/app/assets/javascripts/codepress/codepress.html +36 -0
- data/app/assets/javascripts/codepress/codepress.js +130 -0
- data/app/assets/javascripts/codepress/engines/gecko.js +240 -0
- data/{vendor/gems/acts_as_tree/test/abstract_unit.rb → app/assets/javascripts/codepress/engines/khtml.js} +0 -0
- data/app/assets/javascripts/codepress/engines/msie.js +263 -0
- data/{vendor/gems/acts_as_tree/test/database.yml → app/assets/javascripts/codepress/engines/older.js} +0 -0
- data/app/assets/javascripts/codepress/engines/opera.js +259 -0
- data/app/assets/javascripts/codepress/languages/css.js +23 -0
- data/app/assets/javascripts/codepress/languages/generic.js +25 -0
- data/app/assets/javascripts/codepress/languages/html.js +63 -0
- data/app/assets/javascripts/codepress/languages/java.js +24 -0
- data/app/assets/javascripts/codepress/languages/javascript.js +30 -0
- data/app/assets/javascripts/codepress/languages/perl.js +27 -0
- data/app/assets/javascripts/codepress/languages/php.js +60 -0
- data/app/assets/javascripts/codepress/languages/ruby.js +26 -0
- data/app/assets/javascripts/codepress/languages/sql.js +30 -0
- data/app/assets/javascripts/codepress/languages/text.js +9 -0
- data/app/assets/javascripts/cropper.js +568 -0
- data/app/assets/javascripts/dojo/dojo.js +14155 -0
- data/app/assets/javascripts/dojo/src/html/images/shadowB.png +0 -0
- data/app/assets/javascripts/dojo/src/html/images/shadowBL.png +0 -0
- data/app/assets/javascripts/dojo/src/html/images/shadowBR.png +0 -0
- data/app/assets/javascripts/dojo/src/html/images/shadowL.png +0 -0
- data/app/assets/javascripts/dojo/src/html/images/shadowR.png +0 -0
- data/app/assets/javascripts/dojo/src/html/images/shadowT.png +0 -0
- data/app/assets/javascripts/dojo/src/html/images/shadowTL.png +0 -0
- data/app/assets/javascripts/dojo/src/html/images/shadowTR.png +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/Editor2/showtableborder_gecko.css +19 -0
- data/app/assets/javascripts/dojo/src/widget/templates/HslColorPicker.svg +30 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/aggregate.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/aggregate.psd +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/backcolor.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/bg-fade.png +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/bold.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/cancel.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/copy.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/createlink.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/cut.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/delete.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/forecolor.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/hilitecolor.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/indent.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/inserthorizontalrule.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/insertimage.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/insertorderedlist.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/inserttable.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/insertunorderedlist.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/italic.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/justifycenter.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/justifyfull.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/justifyleft.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/justifyright.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/left_to_right.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/list_bullet_indent.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/list_bullet_outdent.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/list_num_indent.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/list_num_outdent.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/outdent.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/paste.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/redo.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/removeformat.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/right_to_left.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/save.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/sep.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/space.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/strikethrough.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/subscript.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/superscript.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/underline.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/undo.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/buttons/wikiword.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/check.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/decrementMonth.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/decrementWeek.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/grabCorner.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/floatingPaneClose.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaAccordionOff.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaAccordionSelected.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaActive-c.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaActive-l.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaActive-r.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaBarBg.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaButton-c.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaButton-l.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaButton-r.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaDisabled-c.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaDisabled-l.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaDisabled-r.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaMenuBg.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaPressed-c.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaPressed-l.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/soriaPressed-r.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/tab_close.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/images/toolbar-bg.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/incrementMonth.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/incrementWeek.gif +0 -0
- data/app/assets/javascripts/dojo/src/widget/templates/richtextframe.html +24 -0
- data/app/assets/javascripts/imagine.js +1385 -0
- data/app/assets/javascripts/jquery_no_conflict.js +9405 -0
- data/app/assets/stylesheets/codepress/codepress.css +7 -0
- data/app/assets/stylesheets/codepress/languages/css.css +10 -0
- data/app/assets/stylesheets/codepress/languages/generic.css +9 -0
- data/app/assets/stylesheets/codepress/languages/html.css +18 -0
- data/app/assets/stylesheets/codepress/languages/java.css +7 -0
- data/app/assets/stylesheets/codepress/languages/javascript.css +8 -0
- data/app/assets/stylesheets/codepress/languages/perl.css +11 -0
- data/app/assets/stylesheets/codepress/languages/php.css +12 -0
- data/app/assets/stylesheets/codepress/languages/ruby.css +10 -0
- data/app/assets/stylesheets/codepress/languages/sql.css +10 -0
- data/app/assets/stylesheets/codepress/languages/text.css +5 -0
- data/app/assets/stylesheets/cropper.css +182 -0
- data/app/assets/stylesheets/management.css +96 -0
- data/app/assets/stylesheets/reset.css +58 -0
- data/app/controllers/cms/content_controller.rb +318 -2
- data/app/controllers/management/cms_controller.rb +1669 -0
- data/app/controllers/management/user_controller.rb +4 -4
- data/app/controllers/management/users_controller.rb +18 -4
- data/app/controllers/util_controller.rb +45 -0
- data/app/helpers/cms_application_helper.rb +662 -15
- data/app/models/cms_content_sweeper.rb +21 -0
- data/app/models/cms_page.rb +126 -0
- data/app/models/cms_page_object.rb +23 -0
- data/app/models/cms_page_tag.rb +5 -0
- data/app/models/cms_page_version.rb +3 -0
- data/app/models/cms_snippet.rb +16 -0
- data/app/models/cms_template.rb +29 -0
- data/app/models/user.rb +6 -3
- data/app/views/management/cms/_complete_gallery.html.erb +5 -0
- data/app/views/management/cms/_create_file_link.html.erb +21 -0
- data/app/views/management/cms/_crop_feature_image.html.erb +188 -0
- data/app/views/management/cms/_crop_image.html.erb +188 -0
- data/app/views/management/cms/_crop_results.html.erb +1 -0
- data/app/views/management/cms/_crop_results_feature_image.html.erb +1 -0
- data/app/views/management/cms/_crop_results_thumb.html.erb +1 -0
- data/app/views/management/cms/_crop_thumb.html.erb +188 -0
- data/app/views/management/cms/_dialogs.html.erb +39 -0
- data/app/views/management/cms/_edit_page.html.erb +176 -0
- data/app/views/management/cms/_gallery_index.html.erb +10 -0
- data/app/views/management/cms/_gallery_setup.html.erb +22 -0
- data/app/views/management/cms/_image.html.erb +3 -0
- data/app/views/management/cms/_image_details.html.erb +26 -0
- data/app/views/management/cms/_image_draggable.html.erb +4 -0
- data/app/views/management/cms/_list_page.html.erb +8 -0
- data/app/views/management/cms/_list_page_select.html.erb +8 -0
- data/app/views/management/cms/_list_pages.html.erb +1 -0
- data/app/views/management/cms/_list_pages_select.html.erb +1 -0
- data/app/views/management/cms/_page_attribute.html.erb +6 -0
- data/app/views/management/cms/_page_list.html.erb +171 -0
- data/app/views/management/cms/_page_list_source_folder.html.erb +20 -0
- data/app/views/management/cms/_page_list_source_tag.html.erb +18 -0
- data/app/views/management/cms/_select_gallery.html.erb +117 -0
- data/app/views/management/cms/_snippet.html.erb +3 -0
- data/app/views/management/cms/_sort_images.html.erb +15 -0
- data/app/views/management/cms/_temp.html.erb +3 -0
- data/app/views/management/cms/_template_options.html.erb +21 -0
- data/app/views/management/cms/_template_reference.html.erb +42 -0
- data/app/views/management/cms/_upload_feature_image.html.erb +35 -0
- data/app/views/management/cms/_upload_file.html.erb +31 -0
- data/app/views/management/cms/_upload_image.html.erb +74 -0
- data/app/views/management/cms/_upload_thumb.html.erb +35 -0
- data/app/views/management/cms/edit_master.html.erb +48 -0
- data/app/views/management/cms/edit_page_content.html.erb +4 -0
- data/app/views/management/cms/edit_snippet.html.erb +47 -0
- data/app/views/management/cms/edit_template.html.erb +48 -0
- data/app/views/management/cms/gallery_management.html.erb +108 -0
- data/app/views/management/cms/index.html.erb +20 -0
- data/app/views/management/cms/page_tags_for_lookup.html.erb +5 -0
- data/app/views/management/cms/pages.html.erb +99 -0
- data/app/views/management/cms/permission_denied.html.erb +1 -0
- data/app/views/management/cms/select_page.html.erb +57 -0
- data/app/views/management/cms/snippets.html.erb +14 -0
- data/app/views/management/cms/templates.html.erb +14 -0
- data/app/views/management/cms/toolbar_edit.html.erb +269 -0
- data/app/views/management/cms/toolbar_preview.html.erb +109 -0
- data/app/views/util/_calendar_days.html.erb +72 -0
- data/app/views/util/_calendar_month_year.html.erb +1 -0
- data/app/views/util/_date_picker.html.erb +56 -0
- data/app/views/util/_message.html.erb +1 -0
- data/app/views/util/_show_message.js.erb +6 -0
- data/app/views/util/_tab.html.erb +4 -0
- data/config/routes.rb +4 -1
- data/imagine_cms.gemspec +4 -0
- data/{vendor/gems → lib}/acts_as_versioned/.document +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/.gitignore +2 -0
- data/{vendor/gems → lib}/acts_as_versioned/CHANGELOG +0 -0
- data/lib/acts_as_versioned/Gemfile +7 -0
- data/{vendor/gems → lib}/acts_as_versioned/MIT-LICENSE +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/README +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/RUNNING_UNIT_TESTS +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/Rakefile +1 -1
- data/{vendor/gems → lib}/acts_as_versioned/acts_as_versioned.gemspec +4 -4
- data/{vendor/gems → lib}/acts_as_versioned/init.rb +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/lib/acts_as_versioned.rb +109 -107
- data/{vendor/gems → lib}/acts_as_versioned/test/abstract_unit.rb +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/test/database.yml +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/authors.yml +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/landmark.rb +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/landmark_versions.yml +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/landmarks.yml +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/locked_pages.yml +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/locked_pages_revisions.yml +0 -0
- data/{vendor/gems/acts_as_versioned/test/fixtures/migrations/1_add_versioned_tables.rb → lib/acts_as_versioned/test/fixtures/migrations/2_add_versioned_tables.rb} +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/page.rb +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/page_versions.yml +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/pages.yml +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/widget.rb +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/test/migration_test.rb +0 -1
- data/{vendor/gems → lib}/acts_as_versioned/test/schema.rb +0 -0
- data/{vendor/gems → lib}/acts_as_versioned/test/versioned_test.rb +0 -0
- data/lib/extensions/action_controller.rb +154 -143
- data/lib/imagine_cms/engine.rb +33 -12
- data/lib/imagine_cms/version.rb +1 -1
- data/lib/imagine_cms.rb +30 -6
- data/lib/prototype_legacy_helper/README.markdown +13 -0
- data/lib/prototype_legacy_helper/init.rb +1 -0
- data/lib/prototype_legacy_helper/lib/prototype_legacy_helper.rb +430 -0
- data/lib/prototype_legacy_helper/test/test_prototype_helper.rb +297 -0
- data/lib/upload_progress/CHANGELOG +5 -0
- data/lib/upload_progress/MIT-LICENSE +20 -0
- data/lib/upload_progress/README +45 -0
- data/{vendor/gems/acts_as_tree → lib/upload_progress}/Rakefile +6 -5
- data/lib/upload_progress/init.rb +7 -0
- data/lib/upload_progress/lib/multipart_progress.rb +176 -0
- data/lib/upload_progress/lib/progress.rb +145 -0
- data/lib/upload_progress/lib/upload_progress.rb +303 -0
- data/lib/upload_progress/lib/upload_progress_helper.rb +425 -0
- data/lib/upload_progress/public/stylesheets/upload_progress.css +21 -0
- data/lib/upload_progress/test/multipart_progress_testx.rb +364 -0
- data/lib/upload_progress/test/upload_progress_helper_testx.rb +134 -0
- data/lib/upload_progress/test/upload_progress_testx.rb +88 -0
- metadata +305 -43
- data/app/assets/manage/btn_delete.gif +0 -0
- data/vendor/gems/.DS_Store +0 -0
- data/vendor/gems/acts_as_tree/README +0 -26
- data/vendor/gems/acts_as_tree/init.rb +0 -1
- data/vendor/gems/acts_as_tree/lib/active_record/acts/tree.rb +0 -96
- data/vendor/gems/acts_as_tree/test/acts_as_tree_test.rb +0 -219
- data/vendor/gems/acts_as_tree/test/fixtures/mixin.rb +0 -0
- data/vendor/gems/acts_as_tree/test/fixtures/mixins.yml +0 -0
- data/vendor/gems/acts_as_tree/test/schema.rb +0 -0
- data/vendor/gems/acts_as_versioned/Gemfile +0 -7
@@ -1,12 +1,655 @@
|
|
1
1
|
module CmsApplicationHelper
|
2
2
|
|
3
|
+
# Saves the current request to the session so that it can be replayed later
|
4
|
+
# (for example, after authentication). Only params of type String, Hash and
|
5
|
+
# Array will be saved. save_request is called in a before_filter in
|
6
|
+
# application.rb.
|
7
|
+
#
|
8
|
+
# Two levels of saved params are required so that params can be unsaved in
|
9
|
+
# the event of a 404 or other event that would make the current param set an
|
10
|
+
# unlikely or undesirable candidate for replaying.
|
11
|
+
def save_user_request
|
12
|
+
return if params[:action] == 'login'
|
13
|
+
|
14
|
+
session[:old_saved_user_uri] = session[:saved_user_uri];
|
15
|
+
session[:old_saved_user_params] = session[:saved_user_params] || {};
|
16
|
+
saved_params = params.reject { |k, v| !(v.kind_of?(String) || v.kind_of?(Hash) || v.kind_of?(Array)) }
|
17
|
+
saved_params.each { |key, val| saved_params[key] = val.reject { |k, v| !(v.kind_of?(String) || v.kind_of?(Hash) || v.kind_of?(Array)) } if val.kind_of?(Hash) }
|
18
|
+
session[:saved_user_uri] = request.url
|
19
|
+
session[:saved_user_params] = saved_params
|
20
|
+
end
|
21
|
+
|
22
|
+
# Returns a User object corresponding to the currently logged in user, or returns false
|
23
|
+
# and redirects to the login page if not logged in.
|
24
|
+
def authenticate_user
|
25
|
+
# if user is not logged in, record the current request and redirect
|
26
|
+
if !session[:user_authenticated]
|
27
|
+
if User.find(:all).size == 0
|
28
|
+
flash[:notice] = 'No users exist in the system. Please create one now.'
|
29
|
+
redirect_to :controller => '/management/user', :action => 'create_first'
|
30
|
+
else
|
31
|
+
flash[:notice] = 'This is an admin-only function. To continue, please log in.'
|
32
|
+
save_user_request
|
33
|
+
redirect_to :controller => '/management/user', :action => 'login'
|
34
|
+
end
|
35
|
+
|
36
|
+
return false
|
37
|
+
end
|
38
|
+
|
39
|
+
@user = User.find(session[:user_id]) rescue nil
|
40
|
+
session[:user_is_superuser] = @user.is_superuser rescue nil
|
41
|
+
|
42
|
+
@user
|
43
|
+
end
|
44
|
+
|
45
|
+
# Takes a symbol/string or array of symbols/strings and returns true if user has all
|
46
|
+
# of the named permissions.
|
47
|
+
#
|
48
|
+
# Result is stored in the session to speed up future checks.
|
49
|
+
def user_has_permissions?(*permission_set)
|
50
|
+
return false if !(@user ||= authenticate_user)
|
51
|
+
|
52
|
+
if !permission_set.is_a? Array
|
53
|
+
permission_set = [ permission_set ]
|
54
|
+
end
|
55
|
+
|
56
|
+
if session[:user_is_superuser]
|
57
|
+
for perm in permission_set
|
58
|
+
perm = perm.to_s
|
59
|
+
session[('user_can_' + perm).to_sym] ||= true
|
60
|
+
end
|
61
|
+
return true
|
62
|
+
end
|
63
|
+
|
64
|
+
for perm in permission_set
|
65
|
+
perm = perm.to_s
|
66
|
+
session[('user_can_' + perm).to_sym] = @user.send('can_' + perm)
|
67
|
+
# logger.debug "user_can_#{perm} = #{@user.send('can_' + perm)}"
|
68
|
+
return session[('user_can_' + perm).to_sym]
|
69
|
+
end
|
70
|
+
end
|
71
|
+
alias :user_has_permission? :user_has_permissions?
|
72
|
+
|
73
|
+
# Returns true if a Member is logged in.
|
74
|
+
def is_logged_in?
|
75
|
+
session[:authenticated]
|
76
|
+
end
|
77
|
+
|
78
|
+
# Returns true if a User is logged in.
|
79
|
+
def is_logged_in_user?
|
80
|
+
session[:user_authenticated]
|
81
|
+
end
|
82
|
+
|
83
|
+
# Returns true if the user is editing the current page.
|
84
|
+
# (This just means that we are rendering :controller => 'management/cms', :action => 'edit_page_content'.)
|
85
|
+
def is_editing_page?
|
86
|
+
params[:controller] == 'management/cms' && params[:action] == 'edit_page_content'
|
87
|
+
end
|
88
|
+
|
89
|
+
# Determines whether the input string is a valid email address per RFC specification
|
90
|
+
def valid_email_address?(addr, perform_mx_lookup = false)
|
91
|
+
valid = true
|
92
|
+
|
93
|
+
# simplified regex for speed... the original can basically lock up the system on longish addresses
|
94
|
+
# valid = valid && addr.to_s =~ /\A([\w\d]+(?:[\w\d\!\#\$\%\&\*\+\-\/\=\?\^\`\{\|\}\~\.]*[\w\d]+)*)@((?:[\w\d]+(?:[-]*[\w\d]+)*\.)+[\w]{2,})\z/
|
95
|
+
valid = valid && addr.to_s =~ /\A([\w\d\!\#\$\%\&\*\+\-\/\=\?\^\`\{\|\}\~\.]+)@((?:[\w\d]+(?:[-]*[\w\d]+)*\.)+[\w]{2,})\z/
|
96
|
+
user, host = $1, $2
|
97
|
+
|
98
|
+
if perform_mx_lookup
|
99
|
+
begin
|
100
|
+
# require 'net/dns'
|
101
|
+
res = Net::DNS::Resolver.new
|
102
|
+
valid = valid && res.mx(host).size > 0
|
103
|
+
rescue Exception => e
|
104
|
+
logger.error(e)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
valid
|
109
|
+
end
|
110
|
+
|
111
|
+
### COMPAT: convert_content_path
|
112
|
+
def convert_content_path
|
113
|
+
logger.debug "DEPRECATION WARNING (Imagine CMS) WARNING: convert_content_path called"
|
114
|
+
params[:content_path] = params[:content_path].to_s.split('/') rescue []
|
115
|
+
end
|
116
|
+
|
117
|
+
### COMPAT - template_exists?
|
118
|
+
def template_exists?(template, extension = nil)
|
119
|
+
# ignore extension
|
120
|
+
logger.debug("DEPRECATION WARNING (Imagine CMS) WARNING: template_exists? called")
|
121
|
+
partial = File.join(File.dirname(template), '_' + File.basename(template))
|
122
|
+
lookup_context.find_all(template).any? || lookup_context.find_all(partial).any?
|
123
|
+
end
|
124
|
+
|
125
|
+
### COMPAT - template_exists?
|
126
|
+
def url_for_current
|
127
|
+
logger.debug("DEPRECATION WARNING (Imagine CMS) WARNING: url_for_current called")
|
128
|
+
request.fullpath
|
129
|
+
end
|
130
|
+
|
131
|
+
# Returns the first non-empty string in its arg list. Clearly, depends on nil_empty plugin.
|
132
|
+
def first_non_empty(*args)
|
133
|
+
while !args.empty?
|
134
|
+
ret = args.shift
|
135
|
+
return ret unless ret.to_s.empty?
|
136
|
+
end
|
137
|
+
return ''
|
138
|
+
end
|
139
|
+
|
140
|
+
### COMPAT - log_error
|
141
|
+
def log_error(e)
|
142
|
+
# noop
|
143
|
+
logger.debug("DEPRECATION WARNING (Imagine CMS) WARNING: log_error called")
|
144
|
+
logger.error(e)
|
145
|
+
end
|
146
|
+
|
147
|
+
def convert_invalid_chars_in_params
|
148
|
+
dig_deep(params) { |s| convert_invalid_chars!(s) }
|
149
|
+
end
|
150
|
+
|
151
|
+
def dig_deep(hash, &block)
|
152
|
+
if hash.instance_of? String
|
153
|
+
yield(hash)
|
154
|
+
elsif hash.kind_of? Hash
|
155
|
+
hash.each_key { |h| dig_deep(hash[h]) { |s| block.call(s) } }
|
156
|
+
else
|
157
|
+
nil
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
def convert_invalid_chars!(s)
|
162
|
+
# leave commented out until we're sure these are still needed
|
163
|
+
|
164
|
+
# s.gsub!(/\xe2\x80\x98/, '‘') # ‘
|
165
|
+
# s.gsub!(/\xe2\x80\x99/, '’') # ’
|
166
|
+
# s.gsub!(/\xe2\x80\x9c/, '“') # “
|
167
|
+
# s.gsub!(/\xe2\x80\x9d/, '”') # ”
|
168
|
+
# s.gsub!(/\xe2\x80\x93/, '–') # –
|
169
|
+
# s.gsub!(/\xe2\x80\x94/, '—') # —
|
170
|
+
# s.gsub!(/\xe2\x80\xa2/, '•') # •
|
171
|
+
# s.gsub!(/\xe2\x80\xa6/, '…') # …
|
172
|
+
# s.gsub!(/\xe2\x80\xa8/, ' ') # (space)
|
173
|
+
# s.gsub!(/\xe2\x84\xa2/, '™') # ™
|
174
|
+
#
|
175
|
+
# s.gsub!(/\xc2\xae/, '®') # ®
|
176
|
+
# s.gsub!(/\xc2\xab/, '«') # «
|
177
|
+
# s.gsub!(/\xc2\xbb/, '»') # »
|
178
|
+
# s.gsub!(/\xc2\xbd/, '½') # ½
|
179
|
+
# s.gsub!(/\xc2\xbc/, '¼') # ¼
|
180
|
+
#
|
181
|
+
# s.gsub!(/\xc4\x80/, 'Ā') # Ā
|
182
|
+
# s.gsub!(/\xc4\x81/, 'ā') # ā
|
183
|
+
# s.gsub!(/\xc4\x92/, 'Ē') # Ē
|
184
|
+
# s.gsub!(/\xc4\x93/, 'ē') # ē
|
185
|
+
# s.gsub!(/\xc4\xaa/, 'Ī') # Ī
|
186
|
+
# s.gsub!(/\xc4\xab/, 'ī') # ī
|
187
|
+
# s.gsub!(/\xc5\x8c/, 'Ō') # Ō
|
188
|
+
# s.gsub!(/\xc5\x8d/, 'ō') # ō
|
189
|
+
# s.gsub!(/\xc5\xaa/, 'Ū') # Ū
|
190
|
+
# s.gsub!(/\xc5\xab/, 'ū') # ū
|
191
|
+
#
|
192
|
+
# s.gsub!(/\xc3\x84/, 'Ä') # Ä
|
193
|
+
# s.gsub!(/\xc3\x8b/, 'Ë') # Ë
|
194
|
+
# s.gsub!(/\xc3\x8f/, 'Ï') # Ï
|
195
|
+
# s.gsub!(/\xc3\x96/, 'Ö') # Ö
|
196
|
+
# s.gsub!(/\xc3\x9c/, 'Ü') # Ü
|
197
|
+
# s.gsub!(/\xc3\xa4/, 'ä') # ä
|
198
|
+
# s.gsub!(/\xc3\xab/, 'ë') # ë
|
199
|
+
# s.gsub!(/\xc3\xaf/, 'ï') # ï
|
200
|
+
# s.gsub!(/\xc3\xb6/, 'ö') # ö
|
201
|
+
# s.gsub!(/\xc3\xbc/, 'ü') # ü
|
202
|
+
#
|
203
|
+
# s.gsub!(/\xc3\x81/, 'Á') # Á
|
204
|
+
# s.gsub!(/\xc3\x89/, 'É') # É
|
205
|
+
# s.gsub!(/\xc3\x8d/, 'Í') # Í
|
206
|
+
# s.gsub!(/\xc3\x93/, 'Ó') # Ó
|
207
|
+
# s.gsub!(/\xc3\x9a/, 'Ú') # Ú
|
208
|
+
# s.gsub!(/\xc3\xa1/, 'á') # á
|
209
|
+
# s.gsub!(/\xc3\xa9/, 'é') # é
|
210
|
+
# s.gsub!(/\xc3\xad/, 'í') # í
|
211
|
+
# s.gsub!(/\xc3\xb3/, 'ó') # ó
|
212
|
+
# s.gsub!(/\xc3\xba/, 'ú') # ú
|
213
|
+
#
|
214
|
+
# s.gsub!(/\xc5\x98/, 'Ř') # Ř
|
215
|
+
# s.gsub!(/\xc5\x99/, 'ř') # ř
|
216
|
+
#
|
217
|
+
# s.gsub!(/\x85/, '…') # …
|
218
|
+
# s.gsub!(/\x8b/, '<') # <
|
219
|
+
# s.gsub!(/\x9b/, '>') # >
|
220
|
+
# s.gsub!(/\x91/, '‘') # ‘
|
221
|
+
# s.gsub!(/\x92/, '’') # ’
|
222
|
+
# s.gsub!(/\x93/, '“') # “
|
223
|
+
# s.gsub!(/\x94/, '”') # ”
|
224
|
+
# s.gsub!(/\x97/, '—') # —
|
225
|
+
# s.gsub!(/\x99/, '™') # ™
|
226
|
+
# s.gsub!(/\x95/, '*')
|
227
|
+
# s.gsub!(/\x96/, '-')
|
228
|
+
# s.gsub!(/\x98/, '~')
|
229
|
+
# s.gsub!(/\x88/, '^')
|
230
|
+
# s.gsub!(/\x82/, ',')
|
231
|
+
# s.gsub!(/\x84/, ',,')
|
232
|
+
# s.gsub!(/\x89/, 'o/oo')
|
233
|
+
# s.gsub!(/\x8c/, 'OE')
|
234
|
+
# s.gsub!(/\x9c/, 'oe')
|
235
|
+
end
|
236
|
+
|
237
|
+
# Convert from GMT/UTC to local time (based on time zone setting in session[:time_zone])
|
238
|
+
def gm_to_local(time)
|
239
|
+
ActiveSupport::TimeZone.new(session[:time_zone] || 'UTC').utc_to_local(time)
|
240
|
+
end
|
241
|
+
|
242
|
+
# Convert from local time to GMT/UTC (based on time zone setting in session[:time_zone])
|
243
|
+
def local_to_gm(time)
|
244
|
+
ActiveSupport::TimeZone.new(session[:time_zone] || 'UTC').local_to_utc(time)
|
245
|
+
end
|
246
|
+
|
247
|
+
# Convert a time object into a formatted date/time string
|
248
|
+
def ts_to_str(ts)
|
249
|
+
return '' if ts == nil
|
250
|
+
gm_to_local(ts).strftime('%a %b %d, %Y') + ' at ' +
|
251
|
+
gm_to_local(ts).strftime('%I:%M%p').downcase + ' ' + (session[:time_zone_abbr] || '')
|
252
|
+
end
|
253
|
+
|
254
|
+
# Convert a time object into a formatted time string (no date)
|
255
|
+
def ts_to_time_str(ts)
|
256
|
+
return '' if ts == nil
|
257
|
+
gm_to_local(ts).strftime('%I:%M:%S%p').downcase
|
258
|
+
end
|
259
|
+
|
260
|
+
# Convert times to a standard format (e.g. 1:35pm)
|
261
|
+
def time_to_str(t, convert = true)
|
262
|
+
return '' if t == nil
|
263
|
+
if convert
|
264
|
+
gm_to_local(t).strftime("%I").to_i.to_s + gm_to_local(t).strftime(":%M%p").downcase
|
265
|
+
else
|
266
|
+
t.strftime("%I").to_i.to_s + t.strftime(":%M%p").downcase
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
270
|
+
# Convert times to a standard format (e.g. 1:35pm)
|
271
|
+
def date_to_str(t, convert = true)
|
272
|
+
return '' if t == nil
|
273
|
+
if convert
|
274
|
+
gm_to_local(t).strftime("%m").to_i.to_s + '/' + gm_to_local(t).strftime("%d").to_i.to_s + gm_to_local(t).strftime("/%Y")
|
275
|
+
else
|
276
|
+
t.strftime("%m").to_i.to_s + '/' + t.strftime("%d").to_i.to_s + t.strftime("/%Y")
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
|
281
|
+
|
282
|
+
def load_page_objects(obj_type = nil, name = nil)
|
283
|
+
if params[:version].to_i > 0 && params[:version].to_i != @pg.published_version
|
284
|
+
if is_logged_in_user?
|
285
|
+
if user_has_permission?(:manage_cms)
|
286
|
+
@pg.revert_to(params[:version].to_i)
|
287
|
+
end
|
288
|
+
else
|
289
|
+
authenticate_user
|
290
|
+
return false
|
291
|
+
end
|
292
|
+
elsif @pg.version != @pg.published_version
|
293
|
+
@pg.revert_to(@pg.published_version)
|
294
|
+
end
|
295
|
+
|
296
|
+
@page_objects = HashObject.new
|
297
|
+
conditions = [ 'cms_page_version = ?' ]
|
298
|
+
cond_vars = [ @pg.version ]
|
299
|
+
|
300
|
+
if obj_type
|
301
|
+
conditions << 'obj_type = ?'
|
302
|
+
cond_vars << obj_type
|
303
|
+
end
|
304
|
+
if name
|
305
|
+
conditions << 'name = ?'
|
306
|
+
cond_vars << name
|
307
|
+
end
|
308
|
+
|
309
|
+
@pg.objects.find(:all, :conditions => [ conditions.join(' and ') ].concat(cond_vars)).each do |obj|
|
310
|
+
@page_objects["obj-#{obj.obj_type.to_s}-#{obj.name}"] = obj.content
|
311
|
+
end
|
312
|
+
end
|
313
|
+
|
314
|
+
def page_list_items(pg, key, options = {})
|
315
|
+
pages = []
|
316
|
+
instance_tags_include = []
|
317
|
+
instance_tags_exclude = []
|
318
|
+
instance_tags_require = []
|
319
|
+
|
320
|
+
conditions = [ 'cms_pages.published_version >= 0', 'cms_pages.published_date is not null', 'cms_pages.published_date < NOW()' ]
|
321
|
+
cond_vars = []
|
322
|
+
|
323
|
+
if options[:start_date]
|
324
|
+
options[:start_date] = Time.parse(options[:start_date]) if options[:start_date].is_a? String
|
325
|
+
conditions << 'cms_pages.article_date >= ?'
|
326
|
+
cond_vars << options[:start_date]
|
327
|
+
end
|
328
|
+
if options[:end_date]
|
329
|
+
options[:end_date] = Time.parse(options[:end_date]) if options[:end_date].is_a? String
|
330
|
+
conditions << 'cms_pages.article_date < ?'
|
331
|
+
cond_vars << (options[:end_date] + 1.day)
|
332
|
+
end
|
333
|
+
|
334
|
+
@page_objects["#{key}-sources-tag-count"] = @page_objects["#{key}-sources-tag-count"].to_i
|
335
|
+
|
336
|
+
for i in 0...@page_objects["#{key}-sources-tag-count"]
|
337
|
+
case @page_objects["#{key}-sources-tag#{i}-behavior"]
|
338
|
+
when 'include'
|
339
|
+
instance_tags_include << @page_objects["#{key}-sources-tag#{i}"]
|
340
|
+
when 'exclude'
|
341
|
+
instance_tags_exclude << @page_objects["#{key}-sources-tag#{i}"]
|
342
|
+
when 'require'
|
343
|
+
instance_tags_require << @page_objects["#{key}-sources-tag#{i}"]
|
344
|
+
end
|
345
|
+
end
|
346
|
+
include_tags = instance_tags_include.map { |t| t.strip }.reject { |t| t.empty? }
|
347
|
+
exclude_tags = instance_tags_exclude.map { |t| t.strip }.reject { |t| t.empty? }
|
348
|
+
require_tags = instance_tags_require.map { |t| t.strip }.reject { |t| t.empty? }
|
349
|
+
|
350
|
+
if include_tags.empty?
|
351
|
+
include_tags = (options[:include_tags] || '').split(',').map { |t| t.strip }.reject { |t| t.empty? }
|
352
|
+
include_tags.each do |t|
|
353
|
+
i = @page_objects["#{key}-sources-tag-count"]
|
354
|
+
@page_objects["#{key}-sources-tag#{i}"] = t
|
355
|
+
@page_objects["#{key}-sources-tag#{i}-behavior"] = 'include'
|
356
|
+
@page_objects["#{key}-sources-tag-count"] += 1
|
357
|
+
end
|
358
|
+
end
|
359
|
+
if exclude_tags.empty?
|
360
|
+
exclude_tags = (options[:exclude_tags] || '').split(',').map { |t| t.strip }.reject { |t| t.empty? }
|
361
|
+
exclude_tags.each do |t|
|
362
|
+
i = @page_objects["#{key}-sources-tag-count"]
|
363
|
+
@page_objects["#{key}-sources-tag#{i}"] = t
|
364
|
+
@page_objects["#{key}-sources-tag#{i}-behavior"] = 'exclude'
|
365
|
+
@page_objects["#{key}-sources-tag-count"] += 1
|
366
|
+
end
|
367
|
+
end
|
368
|
+
if require_tags.empty?
|
369
|
+
require_tags = (options[:require_tags] || '').split(',').map { |t| t.strip }.reject { |t| t.empty? }
|
370
|
+
require_tags.each do |t|
|
371
|
+
i = @page_objects["#{key}-sources-tag-count"]
|
372
|
+
@page_objects["#{key}-sources-tag#{i}"] = t
|
373
|
+
@page_objects["#{key}-sources-tag#{i}-behavior"] = 'require'
|
374
|
+
@page_objects["#{key}-sources-tag-count"] += 1
|
375
|
+
end
|
376
|
+
end
|
377
|
+
|
378
|
+
# pull all folder content
|
379
|
+
folders = []
|
380
|
+
for i in 0...@page_objects["#{key}-sources-folder-count"].to_i
|
381
|
+
folders << HashObject.new(:src => @page_objects["#{key}-sources-folder#{i}"].strip,
|
382
|
+
:expand_folders => @page_objects["#{key}-sources-folder#{i}-expand-folders"])
|
383
|
+
end
|
384
|
+
folders = folders.reject { |f| f.src.empty? }
|
385
|
+
|
386
|
+
if folders.empty?
|
387
|
+
folders = (options[:folders] || '').split(',').map do |f|
|
388
|
+
bits = f.strip.split(':')
|
389
|
+
|
390
|
+
obj = HashObject.new
|
391
|
+
obj.src = bits[0]
|
392
|
+
obj.expand_folders = 'true'
|
393
|
+
|
394
|
+
while bit = bits.shift
|
395
|
+
case bit
|
396
|
+
when 'expand-folders'
|
397
|
+
;
|
398
|
+
when 'no-expand-folders'
|
399
|
+
obj.expand_folders = 'false'
|
400
|
+
end
|
401
|
+
end
|
402
|
+
|
403
|
+
obj
|
404
|
+
end
|
405
|
+
folders = folders.reject { |f| f.src.empty? }
|
406
|
+
|
407
|
+
@page_objects["#{key}-sources-folder-count"] = folders.size
|
408
|
+
folders.each_with_index do |f, i|
|
409
|
+
@page_objects["#{key}-sources-folder#{i}"] = f.src
|
410
|
+
@page_objects["#{key}-sources-folder#{i}-expand-folders"] = f.expand_folders
|
411
|
+
end
|
412
|
+
end
|
413
|
+
|
414
|
+
# exclude expired items if specified
|
415
|
+
if @page_objects["#{key}-include-expired"]
|
416
|
+
if @page_objects["#{key}-include-expired"] == 'false'
|
417
|
+
conditions << '(cms_pages.expires = ? OR (cms_pages.expires = ? AND cms_pages.expiration_date >= ?))'
|
418
|
+
cond_vars << false
|
419
|
+
cond_vars << true
|
420
|
+
cond_vars << Time.now
|
421
|
+
end
|
422
|
+
end
|
423
|
+
|
424
|
+
folders.each do |f|
|
425
|
+
begin
|
426
|
+
if f.expand_folders && f.expand_folders == 'false'
|
427
|
+
f.src = f.src.slice(1...f.src.length) if f.src.slice(0,1) == '/'
|
428
|
+
parent_page = CmsPage.find_by_path(f.src)
|
429
|
+
pages.concat parent_page.children.find(:all, :include => [ :tags ], :conditions => [ conditions.join(' and ') ].concat(cond_vars))
|
430
|
+
else
|
431
|
+
if f.src == '/'
|
432
|
+
pages.concat CmsPage.find(:all, :include => [ :tags ], :conditions => [ conditions.join(' and ') ].concat(cond_vars))
|
433
|
+
else
|
434
|
+
f.src = f.src.slice(1...f.src.length) if f.src.slice(0,1) == '/'
|
435
|
+
fconditions = conditions.dup
|
436
|
+
fconditions << 'path like ?'
|
437
|
+
fcond_vars = cond_vars.dup
|
438
|
+
fcond_vars << f.src+'/%'
|
439
|
+
pages.concat CmsPage.find(:all, :include => [ :tags ], :conditions => [ fconditions.join(' and ') ].concat(fcond_vars))
|
440
|
+
end
|
441
|
+
end
|
442
|
+
rescue Exception => e
|
443
|
+
logger.debug e
|
444
|
+
end
|
445
|
+
end
|
446
|
+
|
447
|
+
# pull all include tag content
|
448
|
+
include_tags.each do |tag|
|
449
|
+
pages.concat CmsPageTag.find_all_by_name(tag, :include => [ :page ], :conditions => [ conditions.join(' and ') ].concat(cond_vars)).map { |cpt| cpt.page }
|
450
|
+
end
|
451
|
+
|
452
|
+
# dump anything that has an excluded tag
|
453
|
+
exclude_tags.each do |tag|
|
454
|
+
pages.reject! { |page| page.tags.reject { |t| t.name != tag } != [] }
|
455
|
+
end
|
456
|
+
|
457
|
+
# dump anything that does not have a required tag
|
458
|
+
require_tags.each do |tag|
|
459
|
+
pages.reject! { |page| page.tags.reject { |t| t.name != tag } == [] }
|
460
|
+
end
|
461
|
+
|
462
|
+
if pg && (options[:exclude_current] === true || @page_objects["#{key}-exclude-current"] == 'true')
|
463
|
+
pages.reject! { |page| page == pg }
|
464
|
+
end
|
465
|
+
|
466
|
+
# set some reasonable defaults in case the sort keys are nil
|
467
|
+
pages.each { |pg| pg.article_date ||= Time.now; pg.position ||= 0; pg.title ||= '' }
|
468
|
+
pri_sort_key = first_non_empty(@page_objects["#{key}-sort-first-field"], options[:primary_sort_key], 'article_date')
|
469
|
+
pri_sort_dir = first_non_empty(@page_objects["#{key}-sort-first-direction"], options[:primary_sort_direction], 'asc')
|
470
|
+
sec_sort_key = first_non_empty(@page_objects["#{key}-sort-second-field"], options[:secondary_sort_key], 'position')
|
471
|
+
sec_sort_dir = first_non_empty(@page_objects["#{key}-sort-second-direction"], options[:secondary_sort_direction], 'asc')
|
472
|
+
@page_objects["#{key}-sort-first-field"] ||= pri_sort_key
|
473
|
+
@page_objects["#{key}-sort-first-direction"] ||= pri_sort_dir
|
474
|
+
@page_objects["#{key}-sort-second-field"] ||= sec_sort_key
|
475
|
+
@page_objects["#{key}-sort-second-direction"] ||= sec_sort_dir
|
476
|
+
|
477
|
+
keys_with_dir = [ [ pri_sort_key, pri_sort_dir ], [ sec_sort_key, sec_sort_dir ] ]
|
478
|
+
pages.sort! do |a,b|
|
479
|
+
index = 0
|
480
|
+
result = 0
|
481
|
+
while result == 0 && index < keys_with_dir.size
|
482
|
+
key = keys_with_dir[index][0]
|
483
|
+
aval = a.send(key)
|
484
|
+
bval = b.send(key)
|
485
|
+
|
486
|
+
if !aval
|
487
|
+
result = 1
|
488
|
+
elsif !bval
|
489
|
+
result = -1
|
490
|
+
else
|
491
|
+
result = aval <=> bval
|
492
|
+
end
|
493
|
+
|
494
|
+
result *= -1 if keys_with_dir[index][1] && keys_with_dir[index][1].downcase == 'desc'
|
495
|
+
index += 1
|
496
|
+
end
|
497
|
+
|
498
|
+
result
|
499
|
+
end
|
500
|
+
|
501
|
+
offset = first_non_empty(@page_objects["#{key}-item-offset"], options[:item_offset], 0).to_i
|
502
|
+
pages = pages[offset, pages.size] || []
|
503
|
+
|
504
|
+
# randomize if requested
|
505
|
+
randomize = first_non_empty(@page_objects["#{key}-use-randomization"], options[:use_randomization], 'false').to_s == 'true'
|
506
|
+
random_pool_size = first_non_empty(@page_objects["#{key}-random-pool-size"], options[:random_pool_size], '').to_i
|
507
|
+
if randomize
|
508
|
+
if random_pool_size > 0
|
509
|
+
pages = pages.first(random_pool_size)
|
510
|
+
end
|
511
|
+
|
512
|
+
n = pages.length
|
513
|
+
for i in 0...n
|
514
|
+
r = rand(n-1).floor
|
515
|
+
pages[r], pages[i] = pages[i], pages[r]
|
516
|
+
end
|
517
|
+
end
|
518
|
+
|
519
|
+
pages
|
520
|
+
end
|
521
|
+
|
522
|
+
def substitute_placeholders(html, page, extra_attributes = {})
|
523
|
+
return html unless page
|
524
|
+
|
525
|
+
temp = html.dup
|
526
|
+
|
527
|
+
# mangle anything inside of an insert_object so that it won't be caught (yet)
|
528
|
+
temp.gsub!(/(insert_object\()((?:\(.*?\)|[^()]*?)*)(\))/) do |match|
|
529
|
+
one, two, three = $1, $2, $3
|
530
|
+
one + two.gsub(/<#/, '<!#') + three
|
531
|
+
end
|
532
|
+
|
533
|
+
# first, extras passed in args
|
534
|
+
extra_attributes.each do |k,v|
|
535
|
+
temp.gsub!(/<#\s*#{k.to_s}\s*#>/, v.to_s)
|
536
|
+
end
|
537
|
+
|
538
|
+
# next, page object attributes and template options (from page properties)
|
539
|
+
page.objects.find(:all, :conditions => [ "obj_type = 'attribute'" ]).each do |obj|
|
540
|
+
temp.gsub!(/<#\s*#{obj.name}\s*#>/, (obj.content || '').to_s)
|
541
|
+
end
|
542
|
+
page.objects.find(:all, :conditions => [ "obj_type = 'option'" ]).each do |obj|
|
543
|
+
temp.gsub!(/<#\s*option_#{obj.name.gsub(/[^\w\d]/, '_')}\s*#>/, obj.content || '')
|
544
|
+
end
|
545
|
+
|
546
|
+
# path is kind of a special case, we like to see it with a leading /
|
547
|
+
temp.gsub!(/<#\s*path\s*#>/, '/' + (page.path || ''))
|
548
|
+
|
549
|
+
# substitute tags in a helpful way
|
550
|
+
temp.gsub!(/<#\s*tags\s*#>/, page.tags.map { |t| t.name }.join(', '))
|
551
|
+
temp.gsub!(/<#\s*tags_as_css_classes\s*#>/, page.tags_as_css_classes)
|
552
|
+
|
553
|
+
# use full date/time format for created_on and updated_on
|
554
|
+
temp.gsub!(/<#\s*created_on\s*#>/, "#{page.created_on.getlocal.strftime('%a')} #{date_to_str(page.created_on)} #{time_to_str(page.created_on)}") if page.created_on
|
555
|
+
temp.gsub!(/<#\s*updated_on\s*#>/, "#{page.updated_on.getlocal.strftime('%a')} #{date_to_str(page.updated_on)} #{time_to_str(page.updated_on)}") if page.updated_on
|
556
|
+
|
557
|
+
# handle any custom substitutions
|
558
|
+
temp = substitute_placeholders_custom(temp, page)
|
559
|
+
|
560
|
+
# finally, toss in the rest of the generic class attributes
|
561
|
+
(page.attributes.map { |c| c.first } +
|
562
|
+
[ 'article_date_month', 'article_date_mon', 'article_date_day', 'article_date_year', 'article_date_yr' ]).each do |attr|
|
563
|
+
begin
|
564
|
+
val = page.send(attr.downcase.underscore)
|
565
|
+
case val.class.to_s
|
566
|
+
when 'String'
|
567
|
+
val
|
568
|
+
when 'Time'
|
569
|
+
val = val.strftime("(%a) ") + val.strftime("%B ") + val.day.to_s + val.strftime(", %Y")
|
570
|
+
when 'NilClass'
|
571
|
+
val = ''
|
572
|
+
else
|
573
|
+
# logger.error "#{attr} (#{val.class}): #{val}"
|
574
|
+
end
|
575
|
+
rescue
|
576
|
+
# val = '<!-- attribute not found -->'
|
577
|
+
val = ''
|
578
|
+
end
|
579
|
+
temp.gsub!(/<#\s*#{attr}\s*#>/, val.to_s)
|
580
|
+
end
|
581
|
+
# temp.gsub!(/<#\s*(.*?)\s*#>/, "<!-- attribute not found -->")
|
582
|
+
temp.gsub!(/<#\s*(.*?)\s*#>/, '')
|
583
|
+
|
584
|
+
# unmangle mangled stuff
|
585
|
+
temp.gsub!(/(insert_object\()((?:\(.*?\)|[^()]*?)*)(\))/) do |match|
|
586
|
+
one, two, three = $1, $2, $3
|
587
|
+
one + two.gsub(/<!#/, '<#') + three
|
588
|
+
end
|
589
|
+
|
590
|
+
temp.html_safe
|
591
|
+
end
|
592
|
+
|
593
|
+
# override this method to do your own custom subtitutions
|
594
|
+
def substitute_placeholders_custom(temp, page)
|
595
|
+
# an example:
|
596
|
+
# begin
|
597
|
+
# temp.gsub!(/<#\s*upcoming_event_date\s*#>/, page.article_date.strftime("<span class=\"month\">%b</span><span class=\"day\">%d</span>"))
|
598
|
+
# rescue
|
599
|
+
# end
|
600
|
+
|
601
|
+
# remember to return your modified copy of temp
|
602
|
+
temp
|
603
|
+
end
|
604
|
+
|
605
|
+
|
606
|
+
def template_option(name, type = :string)
|
607
|
+
return nil unless @pg
|
608
|
+
|
609
|
+
@template_options ||= {}
|
610
|
+
@template_options[name] = type
|
611
|
+
|
612
|
+
key = name.gsub(/[^\w\d]/, '_')
|
613
|
+
obj = @pg.objects.find_by_name("#{type}-#{key}", :conditions => [ "obj_type = 'option'" ])
|
614
|
+
return nil unless obj
|
615
|
+
|
616
|
+
case type
|
617
|
+
when :checkbox
|
618
|
+
obj.content == "1"
|
619
|
+
else
|
620
|
+
obj.content
|
621
|
+
end
|
622
|
+
end
|
623
|
+
|
624
|
+
|
625
|
+
def breadcrumbs(options = {})
|
626
|
+
# only works on CCS pages
|
627
|
+
if @pg
|
628
|
+
separator = options.delete(:separator) || ' » '
|
629
|
+
link_class = options.delete(:link_class)
|
630
|
+
|
631
|
+
pg = @pg
|
632
|
+
ret = pg.title
|
633
|
+
|
634
|
+
while pg = pg.parent
|
635
|
+
if pg.published_version >= 0
|
636
|
+
ret = "<a href=\"/#{pg.path}\" class=\"#{link_class}\">#{pg.title}</a>" + separator + ret
|
637
|
+
end
|
638
|
+
end
|
639
|
+
|
640
|
+
return ret
|
641
|
+
else
|
642
|
+
return ''
|
643
|
+
end
|
644
|
+
end
|
645
|
+
|
3
646
|
# Get an array of all times, useful in select's (5 minute interval by default)
|
4
647
|
def all_times_array(interval = 5)
|
5
648
|
a = []
|
6
649
|
(0..23).each do |h|
|
7
650
|
(0..59).each do |m|
|
8
651
|
next unless m % interval == 0
|
9
|
-
t = Time.
|
652
|
+
t = Time.utc(2000, 1, 1, h, m)
|
10
653
|
a << t.strftime("%I").to_i.to_s + t.strftime(":%M%p").downcase
|
11
654
|
end
|
12
655
|
end
|
@@ -41,11 +684,11 @@ module CmsApplicationHelper
|
|
41
684
|
if errors.size > 0
|
42
685
|
ret << " title=\"#{h errors.join('; ')}\""
|
43
686
|
end
|
44
|
-
ret << '><img src="/
|
687
|
+
ret << '><img src="/assets/interface/form_error.gif" width="17" height="17" border="0" />'
|
45
688
|
ret << '</div>'
|
46
689
|
|
47
690
|
ret << "<div id=\"#{object_name}_#{method_name}_loading\" class=\"form-loading\" style=\"display: none;\">"
|
48
|
-
ret << "<img src=\"/
|
691
|
+
ret << "<img src=\"/assets/interface/form_loading.gif\" width=\"16\" height=\"16\" border=\"0\" style=\"margin: 0 1px 1px 0;\" />"
|
49
692
|
ret << "</div>"
|
50
693
|
|
51
694
|
if errors.size > 0 && options[:display_messages]
|
@@ -78,10 +721,10 @@ module CmsApplicationHelper
|
|
78
721
|
def flash_message
|
79
722
|
output = ''.html_safe
|
80
723
|
if (flash[:error] || @error || '') != ''
|
81
|
-
output << content_tag('div', :class => 'alert alert-error') { flash[:error] || @error }
|
724
|
+
output << content_tag('div', :class => 'alert alert-error error') { flash[:error] || @error }
|
82
725
|
end
|
83
726
|
if (flash[:notice] || @notice || '') != ''
|
84
|
-
output << content_tag('div', :class => 'alert alert-info') { flash[:notice] || @notice }
|
727
|
+
output << content_tag('div', :class => 'alert alert-info notice') { flash[:notice] || @notice }
|
85
728
|
end
|
86
729
|
output
|
87
730
|
end
|
@@ -151,14 +794,17 @@ module CmsApplicationHelper
|
|
151
794
|
|
152
795
|
# Creates a mailto: link that is encoded to prevent most harvesting attempts.
|
153
796
|
def encoded_mail_to(email, link_text = nil)
|
797
|
+
email = h(email)
|
154
798
|
url = ''
|
155
799
|
text = ''
|
156
|
-
|
157
|
-
|
158
|
-
|
800
|
+
|
801
|
+
# this only works with ascii, but email addresses are supposed to be ascii
|
802
|
+
email.bytes.to_a.each_with_index do |b, i|
|
803
|
+
url << (i % 2 == 0 ? sprintf("%%%x", b) : b)
|
804
|
+
text << (i % 4 == 0 ? '<span>' << b << '</span>' : b)
|
159
805
|
end
|
160
806
|
|
161
|
-
"<a href=\"mailto:#{url}\">#{link_text || text}</a>"
|
807
|
+
"<a href=\"mailto:#{url}\">#{link_text || text}</a>".html_safe
|
162
808
|
end
|
163
809
|
|
164
810
|
# Display a date picker with an ajax calendar.
|
@@ -221,18 +867,18 @@ module CmsApplicationHelper
|
|
221
867
|
|
222
868
|
ret = <<EOF
|
223
869
|
<span><a href="#" onclick="showDatePicker('#{object}', '#{method_prefix}'); return false;"><span id="date_picker_#{object}_#{method_prefix}_value">#{default_value.strftime('%a %m/%d/%y')}</span></a></span>
|
224
|
-
<span id="date_picker_#{object}_#{method_prefix}icon"><a href="#" onclick="showDatePicker('#{object}', '#{method_prefix}'); return false;"><img src="/
|
870
|
+
<span id="date_picker_#{object}_#{method_prefix}icon"><a href="#" onclick="showDatePicker('#{object}', '#{method_prefix}'); return false;"><img src="/assets/interface/icon_time.gif" style="float: none" alt="date picker" /></a></span>
|
225
871
|
<div id="date_picker_#{object}_#{method_prefix}main" style="display: none; background-color: white; border: 1px solid gray; padding: 3px; z-index: 101;" class="date-picker-main">
|
226
872
|
<table width="190">
|
227
873
|
<tr>
|
228
|
-
<td><a href="#" onclick="dpPrevMonth('#{object}', '#{method_prefix}', #{min_year}); #{h(draw_calendar)}; return false;"><img src="/
|
874
|
+
<td><a href="#" onclick="dpPrevMonth('#{object}', '#{method_prefix}', #{min_year}); #{h(draw_calendar)}; return false;"><img src="/assets/interface/arrow_previous.gif" border="0" alt="Previous" style="float: left; padding: 2px 0 0 6px; margin: 0;" /></a></td>
|
229
875
|
<td colspan="5" align="center">
|
230
876
|
<nobr>
|
231
877
|
#{ select_tag object + '_' + method_prefix + '_month_sel', options_for_select(months_hash, default_value.month.to_s), :class => 'form', :style => 'border: 1px solid gray; font-size: 11px; padding: 0; margin: 0;', :onchange => h(draw_calendar) }
|
232
878
|
#{ select_tag object + '_' + method_prefix + '_year_sel', options_for_select((min_year..max_year).to_a, default_value.year), :class => 'form', :style => 'border: 1px solid gray; font-size: 11px; padding: 0; margin: 0;', :onchange => h(draw_calendar) }
|
233
879
|
</nobr>
|
234
880
|
</td>
|
235
|
-
<td><a href="#" onclick="dpNextMonth('#{object}', '#{method_prefix}', '#{max_year}'); #{h(draw_calendar)}; return false;"><img src="/
|
881
|
+
<td><a href="#" onclick="dpNextMonth('#{object}', '#{method_prefix}', '#{max_year}'); #{h(draw_calendar)}; return false;"><img src="/assets/interface/arrow_next.gif" border="0" alt="Next" style="float: right; padding: 2px 6px 0 0; margin: 0;" /></a></td>
|
236
882
|
</tr>
|
237
883
|
</table>
|
238
884
|
<div id="date_picker_#{object}_#{method_prefix}_days" class="date-picker-days"></div>
|
@@ -245,6 +891,7 @@ module CmsApplicationHelper
|
|
245
891
|
</div>
|
246
892
|
EOF
|
247
893
|
ret += javascript_tag(draw_calendar)
|
894
|
+
ret.html_safe
|
248
895
|
end
|
249
896
|
|
250
897
|
# Display a clickable ajax event calendar.
|
@@ -290,7 +937,7 @@ EOF
|
|
290
937
|
@css_prefix = css_prefix
|
291
938
|
@popout_direction = popout_direction
|
292
939
|
|
293
|
-
first_of_month = Time.
|
940
|
+
first_of_month = Time.utc(@year, @month, 1)
|
294
941
|
last_of_month = first_of_month.end_of_month
|
295
942
|
events = @calendar.events.find(:all, :conditions => [ 'start_date >= ? and start_date <= ?', first_of_month, last_of_month ])
|
296
943
|
|
@@ -305,7 +952,7 @@ EOF
|
|
305
952
|
<td class="#{css_prefix}container">
|
306
953
|
<table class="#{css_prefix}head" cellspacing="0" cellpadding="0" border="0">
|
307
954
|
<tr class="#{css_prefix}head">
|
308
|
-
<td class="#{css_prefix}head #{css_prefix}head_prev_month"><a href="#" onclick="dpPrevMonth('event', 'calendar', #{min_year}); #{draw_calendar}; return false;"><img src="/
|
955
|
+
<td class="#{css_prefix}head #{css_prefix}head_prev_month"><a href="#" onclick="dpPrevMonth('event', 'calendar', #{min_year}); #{draw_calendar}; return false;"><img src="/assets/interface/arrow_previous.gif" border="0" alt="Previous" style="float: left; padding-left: 2px;" /></a></td>
|
309
956
|
<td class="#{css_prefix}head #{css_prefix}head_month_select">
|
310
957
|
<div#{options[:show_selects] ? '' : ' style="display: none"'}>
|
311
958
|
#{ select 'event_calendar', 'month_sel', months_hash, { :selected => Time.now.month.to_s }, :class => 'form', :style => 'font-size: 11px;', :onchange => draw_calendar }
|
@@ -315,7 +962,7 @@ EOF
|
|
315
962
|
#{render '/util/_calendar_month_year'}
|
316
963
|
</div>
|
317
964
|
</td>
|
318
|
-
<td class="#{css_prefix}head #{css_prefix}head_next_month"><a href="#" onclick="dpNextMonth('event', 'calendar', '#{max_year}'); #{draw_calendar}; return false;"><img src="/
|
965
|
+
<td class="#{css_prefix}head #{css_prefix}head_next_month"><a href="#" onclick="dpNextMonth('event', 'calendar', '#{max_year}'); #{draw_calendar}; return false;"><img src="/assets/interface/arrow_next.gif" border="0" alt="Next" style="float: right; padding-right: 2px;" /></a></td>
|
319
966
|
</tr>
|
320
967
|
</table>
|
321
968
|
</td>
|