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
@@ -249,12 +249,12 @@ module ActiveRecord #:nodoc:
|
|
249
249
|
|
250
250
|
versioned_class.cattr_accessor :original_class
|
251
251
|
versioned_class.original_class = self
|
252
|
-
versioned_class.
|
252
|
+
versioned_class.table_name = versioned_table_name
|
253
253
|
versioned_class.belongs_to self.to_s.demodulize.underscore.to_sym,
|
254
254
|
:class_name => "::#{self.to_s}",
|
255
255
|
:foreign_key => versioned_foreign_key
|
256
256
|
versioned_class.send :include, options[:extend] if options[:extend].is_a?(Module)
|
257
|
-
versioned_class.
|
257
|
+
versioned_class.sequence_name = version_sequence_name if version_sequence_name
|
258
258
|
end
|
259
259
|
|
260
260
|
module Behaviors
|
@@ -268,134 +268,136 @@ module ActiveRecord #:nodoc:
|
|
268
268
|
after_save :clear_old_versions
|
269
269
|
end
|
270
270
|
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
rev.save
|
281
|
-
end
|
271
|
+
# Saves a version of the model in the versioned table. This is called in the after_save callback by default
|
272
|
+
def save_version
|
273
|
+
if @saving_version
|
274
|
+
@saving_version = nil
|
275
|
+
rev = self.class.versioned_class.new
|
276
|
+
clone_versioned_model(self, rev)
|
277
|
+
rev.send("#{self.class.version_column}=", send(self.class.version_column))
|
278
|
+
rev.send("#{self.class.versioned_foreign_key}=", id)
|
279
|
+
rev.save
|
282
280
|
end
|
281
|
+
end
|
283
282
|
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
end
|
283
|
+
# Clears old revisions if a limit is set with the :limit option in <tt>acts_as_versioned</tt>.
|
284
|
+
# Override this method to set your own criteria for clearing old versions.
|
285
|
+
def clear_old_versions
|
286
|
+
return if self.class.max_version_limit == 0
|
287
|
+
excess_baggage = send(self.class.version_column).to_i - self.class.max_version_limit
|
288
|
+
if excess_baggage > 0
|
289
|
+
self.class.versioned_class.delete_all ["#{self.class.version_column} <= ? and #{self.class.versioned_foreign_key} = ?", excess_baggage, id]
|
292
290
|
end
|
291
|
+
end
|
293
292
|
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
end
|
301
|
-
self.clone_versioned_model(version, self)
|
302
|
-
send("#{self.class.version_column}=", version.send(self.class.version_column))
|
303
|
-
true
|
293
|
+
# Reverts a model to a given version. Takes either a version number or an instance of the versioned model
|
294
|
+
def revert_to(version)
|
295
|
+
if version.is_a?(self.class.versioned_class)
|
296
|
+
return false unless version.send(self.class.versioned_foreign_key) == id and !version.new_record?
|
297
|
+
else
|
298
|
+
return false unless version = versions.where(self.class.version_column => version).first
|
304
299
|
end
|
300
|
+
self.clone_versioned_model(version, self)
|
301
|
+
send("#{self.class.version_column}=", version.send(self.class.version_column))
|
302
|
+
true
|
303
|
+
end
|
305
304
|
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
305
|
+
# Reverts a model to a given version and saves the model.
|
306
|
+
# Takes either a version number or an instance of the versioned model
|
307
|
+
def revert_to!(version)
|
308
|
+
revert_to(version) ? save_without_revision : false
|
309
|
+
end
|
311
310
|
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
311
|
+
# Temporarily turns off Optimistic Locking while saving. Used when reverting so that a new version is not created.
|
312
|
+
def save_without_revision
|
313
|
+
save_without_revision!
|
314
|
+
true
|
315
|
+
rescue
|
316
|
+
false
|
317
|
+
end
|
319
318
|
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
end
|
319
|
+
def save_without_revision!
|
320
|
+
without_locking do
|
321
|
+
without_revision do
|
322
|
+
save!
|
325
323
|
end
|
326
324
|
end
|
325
|
+
end
|
327
326
|
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
# Clones a model. Used when saving a new version or reverting a model's version.
|
333
|
-
def clone_versioned_model(orig_model, new_model)
|
334
|
-
self.class.versioned_columns.each do |col|
|
335
|
-
new_model[col.name] = orig_model.send(col.name) if orig_model.has_attribute?(col.name)
|
336
|
-
end
|
327
|
+
def altered?
|
328
|
+
track_altered_attributes ? (version_if_changed - changed).length < version_if_changed.length : changed?
|
329
|
+
end
|
337
330
|
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
end
|
331
|
+
# Clones a model. Used when saving a new version or reverting a model's version.
|
332
|
+
def clone_versioned_model(orig_model, new_model)
|
333
|
+
self.class.versioned_columns.each do |col|
|
334
|
+
new_model[col.name] = orig_model.send(col.name) if orig_model.has_attribute?(col.name)
|
343
335
|
end
|
344
336
|
|
345
|
-
|
346
|
-
|
347
|
-
|
337
|
+
clone_inheritance_column(orig_model, new_model)
|
338
|
+
end
|
339
|
+
|
340
|
+
def clone_inheritance_column(orig_model, new_model)
|
341
|
+
if orig_model.is_a?(self.class.versioned_class) && new_model.class.column_names.include?(new_model.class.inheritance_column.to_s)
|
342
|
+
new_model[new_model.class.inheritance_column] = orig_model[self.class.versioned_inheritance_column]
|
343
|
+
elsif new_model.is_a?(self.class.versioned_class) && new_model.class.column_names.include?(self.class.versioned_inheritance_column.to_s)
|
344
|
+
new_model[self.class.versioned_inheritance_column] = orig_model[orig_model.class.inheritance_column]
|
348
345
|
end
|
346
|
+
end
|
349
347
|
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
when version_condition.is_a?(Symbol)
|
355
|
-
send(version_condition)
|
356
|
-
when version_condition.respond_to?(:call) && (version_condition.arity == 1 || version_condition.arity == -1)
|
357
|
-
version_condition.call(self)
|
358
|
-
else
|
359
|
-
version_condition
|
360
|
-
end
|
361
|
-
end
|
348
|
+
# Checks whether a new version shall be saved or not. Calls <tt>version_condition_met?</tt> and <tt>changed?</tt>.
|
349
|
+
def save_version?
|
350
|
+
version_condition_met? && altered?
|
351
|
+
end
|
362
352
|
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
353
|
+
# Checks condition set in the :if option to check whether a revision should be created or not. Override this for
|
354
|
+
# custom version condition checking.
|
355
|
+
def version_condition_met?
|
356
|
+
case
|
357
|
+
when version_condition.is_a?(Symbol)
|
358
|
+
send(version_condition)
|
359
|
+
when version_condition.respond_to?(:call) && (version_condition.arity == 1 || version_condition.arity == -1)
|
360
|
+
version_condition.call(self)
|
361
|
+
else
|
362
|
+
version_condition
|
371
363
|
end
|
364
|
+
end
|
372
365
|
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
366
|
+
# Executes the block with the versioning callbacks disabled.
|
367
|
+
#
|
368
|
+
# @foo.without_revision do
|
369
|
+
# @foo.save
|
370
|
+
# end
|
371
|
+
#
|
372
|
+
def without_revision(&block)
|
373
|
+
self.class.without_revision(&block)
|
374
|
+
end
|
382
375
|
|
383
|
-
|
384
|
-
|
376
|
+
# Turns off optimistic locking for the duration of the block
|
377
|
+
#
|
378
|
+
# @foo.without_locking do
|
379
|
+
# @foo.save
|
380
|
+
# end
|
381
|
+
#
|
382
|
+
def without_locking(&block)
|
383
|
+
self.class.without_locking(&block)
|
384
|
+
end
|
385
385
|
|
386
|
-
|
386
|
+
def empty_callback()
|
387
|
+
end
|
387
388
|
|
388
|
-
|
389
|
-
# sets the new version before saving, unless you're using optimistic locking. In that case, let it take care of the version.
|
390
|
-
def set_new_version
|
391
|
-
@saving_version = new_record? || save_version?
|
392
|
-
self.send("#{self.class.version_column}=", next_version) if new_record? || (!locking_enabled? && save_version?)
|
393
|
-
end
|
389
|
+
#:nodoc:
|
394
390
|
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
391
|
+
protected
|
392
|
+
# sets the new version before saving, unless you're using optimistic locking. In that case, let it take care of the version.
|
393
|
+
def set_new_version
|
394
|
+
@saving_version = new_record? || save_version?
|
395
|
+
self.send("#{self.class.version_column}=", next_version) if new_record? || (!locking_enabled? && save_version?)
|
396
|
+
end
|
397
|
+
|
398
|
+
# Gets the next available version for the current record, or 1 for a new record
|
399
|
+
def next_version
|
400
|
+
(new_record? ? 0 : versions.calculate(:maximum, version_column).to_i) + 1
|
399
401
|
end
|
400
402
|
|
401
403
|
module ClassMethods
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -1,172 +1,183 @@
|
|
1
1
|
module ActionControllerExtensions
|
2
|
+
|
2
3
|
module ClassMethods
|
3
4
|
end
|
4
5
|
|
5
6
|
module InstanceMethods
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
# application.rb.
|
11
|
-
#
|
12
|
-
# Two levels of saved params are required so that params can be unsaved in
|
13
|
-
# the event of a 404 or other event that would make the current param set an
|
14
|
-
# unlikely or undesirable candidate for replaying.
|
15
|
-
def save_user_request
|
16
|
-
return if params[:action] == 'login'
|
17
|
-
|
18
|
-
session[:old_saved_user_uri] = session[:saved_user_uri];
|
19
|
-
session[:old_saved_user_params] = session[:saved_user_params] || {};
|
20
|
-
saved_params = params.reject { |k, v| !(v.kind_of?(String) || v.kind_of?(Hash) || v.kind_of?(Array)) }
|
21
|
-
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) }
|
22
|
-
session[:saved_user_uri] = request.url
|
23
|
-
session[:saved_user_params] = saved_params
|
24
|
-
end
|
25
|
-
|
26
|
-
# Returns a User object corresponding to the currently logged in user, or returns false
|
27
|
-
# and redirects to the login page if not logged in.
|
28
|
-
def authenticate_user
|
29
|
-
# if user is not logged in, record the current request and redirect
|
30
|
-
if !session[:user_authenticated]
|
31
|
-
if User.find(:all).size == 0
|
32
|
-
flash[:notice] = 'No users exist in the system. Please create one now.'
|
33
|
-
redirect_to :controller => '/management/user', :action => 'create_first'
|
34
|
-
else
|
35
|
-
flash[:notice] = 'This is an admin-only function. To continue, please log in.'
|
36
|
-
save_user_request
|
37
|
-
redirect_to :controller => '/management/user', :action => 'login'
|
38
|
-
end
|
7
|
+
def expire_session_data # :nodoc:
|
8
|
+
# make sure this is not the first run (session being initialized)
|
9
|
+
if session[:last_active]
|
10
|
+
idle_time = Time.now - session[:last_active]
|
39
11
|
|
40
|
-
|
12
|
+
# expire session data as necessary
|
13
|
+
# session_data = session.instance_variable_get("@data")
|
14
|
+
# session_data.select { |k,v| k.to_s !~ /_expiration$/ && v }.each do |k,v|
|
15
|
+
# idx = k.to_s + '_expiration'
|
16
|
+
# if (exp = (session[idx] || session[idx.to_sym]).to_i) > 0
|
17
|
+
# if idle_time > exp
|
18
|
+
# logger.debug "Expiring #{k} = #{v} (expiration #{exp} > idle time #{idle_time})"
|
19
|
+
# session[k] = nil
|
20
|
+
# else
|
21
|
+
# logger.debug "Retaining #{k} = #{v} (expiration #{exp} < idle time #{idle_time})"
|
22
|
+
# end
|
23
|
+
# else
|
24
|
+
# #logger.debug "Retaining #{k} = #{v} (does not expire)"
|
25
|
+
# end
|
26
|
+
# end
|
41
27
|
end
|
42
28
|
|
43
|
-
|
44
|
-
session[:
|
45
|
-
|
46
|
-
|
29
|
+
# bump/set last active time
|
30
|
+
session[:last_active] = Time.now
|
31
|
+
if is_logged_in_user?
|
32
|
+
cookies[:user_auth_status] = { :value => 'authenticated', :expires => 5.minutes.from_now }
|
33
|
+
end
|
47
34
|
end
|
48
35
|
|
49
|
-
|
50
|
-
#
|
51
|
-
#
|
52
|
-
#
|
53
|
-
def
|
54
|
-
|
36
|
+
|
37
|
+
# valid options:
|
38
|
+
# * :include_tags => 'tags, to, include'
|
39
|
+
# * :exclude_tags => 'tags, to, exclude'
|
40
|
+
def insert_object(name, type = :text, options = {}, html_options = {})
|
41
|
+
extend ActionView::Helpers::TagHelper
|
42
|
+
extend ActionView::Helpers::TextHelper
|
55
43
|
|
56
|
-
|
57
|
-
permission_set = [ permission_set ]
|
58
|
-
end
|
44
|
+
@page_objects ||= {}
|
59
45
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
46
|
+
key = "obj-#{type.to_s}-#{name.gsub(/[^\w]/, '_')}"
|
47
|
+
case type.to_sym
|
48
|
+
when :string
|
49
|
+
content = substitute_placeholders(@page_objects[key] || '', @pg)
|
50
|
+
content = erb_render(content)
|
51
|
+
content = auto_link(content, :all, :target => '_blank') unless options[:disable_auto_link]
|
52
|
+
content_tag :span, content, html_options
|
53
|
+
when :text
|
54
|
+
content = substitute_placeholders(@page_objects[key] || '', @pg)
|
55
|
+
content = erb_render(content)
|
56
|
+
# content = auto_link(content, :all, :target => '_blank') unless options[:disable_auto_link]
|
57
|
+
content_tag :div, content, html_options
|
58
|
+
when :page_list
|
59
|
+
@rss_feeds ||= []
|
60
|
+
@rss_feeds << name
|
61
|
+
|
62
|
+
case @page_objects["#{key}-style-display-as"]
|
63
|
+
when 'calendar'
|
64
|
+
pages = page_list_items(@pg, key, options).compact.uniq.
|
65
|
+
sort { |a,b| (a.position || 0) <=> (b.position || 0) }.
|
66
|
+
sort { |a,b| (b.article_date || b.published_date || Time.now) <=>
|
67
|
+
(a.article_date || a.published_date || Time.now) }
|
68
|
+
render :partial => 'page_list_calendar', :locals => { :key => key, :pages => pages }
|
69
|
+
else # display as 'list'
|
70
|
+
today = Time.utc(Time.now.year, Time.now.month, Time.now.day)
|
71
|
+
case @page_objects["#{key}-date-range"]
|
72
|
+
when 'all'
|
73
|
+
when 'past'
|
74
|
+
options[:end_date] ||= today
|
75
|
+
when 'future'
|
76
|
+
options[:start_date] ||= today
|
77
|
+
when 'custom'
|
78
|
+
options[:start_date] ||= @page_objects["#{key}-date-range-custom-start"]
|
79
|
+
options[:end_date] ||= @page_objects["#{key}-date-range-custom-end"]
|
80
|
+
end
|
81
|
+
|
82
|
+
pages = page_list_items(@pg, key, options).compact.uniq
|
83
|
+
|
84
|
+
options[:wrapper_div] = true
|
85
|
+
|
86
|
+
# make options specified in snippets and templates accessible to
|
87
|
+
# page list segments and rss feeds
|
88
|
+
@page_objects["#{key}-template"] = options[:template] if @page_objects["#{key}-template"].empty?
|
89
|
+
|
90
|
+
render_page_list_segment(name, pages, options, html_options)
|
64
91
|
end
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
92
|
+
when :snippet
|
93
|
+
@snippet = CmsSnippet.find_by_name(name)
|
94
|
+
if @snippet
|
95
|
+
erb_render(substitute_placeholders(@snippet.content, @pg))
|
96
|
+
else
|
97
|
+
'Could not find snippet "' + name + '" in the database.'
|
98
|
+
end
|
99
|
+
when :photo_gallery
|
100
|
+
gallery_dir = File.join('images', 'content', @pg.path, File.basename(name))
|
101
|
+
Dir.chdir(File.join(Rails.root, 'public'))
|
102
|
+
all_images = Dir.glob("#{gallery_dir}/*.{jpg,jpeg,png,gif}")
|
103
|
+
Dir.chdir(Rails.root)
|
104
|
+
all_images.sort! { |a,b| File.basename(a).to_i <=> File.basename(b).to_i }
|
105
|
+
images = all_images.reject { |img| img =~ /-thumb/ }
|
106
|
+
thumbs = all_images.reject { |img| img !~ /-thumb/ }
|
107
|
+
render_to_string(:partial => 'photo_gallery', :locals => { :name => name, :images => images, :thumbs => thumbs }).html_safe
|
73
108
|
end
|
74
109
|
end
|
75
|
-
alias :user_has_permission? :user_has_permissions?
|
76
110
|
|
77
|
-
|
78
|
-
|
79
|
-
|
111
|
+
def render_page_list_segment(name, pages, options = {}, html_options = {})
|
112
|
+
extend ActionView::Helpers::TagHelper
|
113
|
+
extend ActionView::Helpers::TextHelper
|
114
|
+
extend ActionView::Helpers::JavaScriptHelper
|
115
|
+
extend ActionView::Helpers::PrototypeHelper
|
80
116
|
|
81
|
-
|
82
|
-
# valid = valid && addr.to_s =~ /\A([\w\d]+(?:[\w\d\!\#\$\%\&\*\+\-\/\=\?\^\`\{\|\}\~\.]*[\w\d]+)*)@((?:[\w\d]+(?:[-]*[\w\d]+)*\.)+[\w]{2,})\z/
|
83
|
-
valid = valid && addr.to_s =~ /\A([\w\d\!\#\$\%\&\*\+\-\/\=\?\^\`\{\|\}\~\.]+)@((?:[\w\d]+(?:[-]*[\w\d]+)*\.)+[\w]{2,})\z/
|
84
|
-
user, host = $1, $2
|
117
|
+
key = "obj-page_list-#{name.gsub(/[^\w]/, '_')}"
|
85
118
|
|
86
|
-
|
87
|
-
|
119
|
+
offset = first_non_empty(params[:offset], 0).to_i
|
120
|
+
limit = first_non_empty(@page_objects["#{key}-max-item-count"], options[:item_count], pages.size).to_i
|
121
|
+
limit = 1 if limit < 1
|
122
|
+
page_subset = pages[offset, limit] || []
|
88
123
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
124
|
+
content = ''
|
125
|
+
content << substitute_placeholders(first_non_empty(@page_objects["#{key}-header"], options[:header]), @pg,
|
126
|
+
:count => page_subset.size, :total => pages.size,
|
127
|
+
:rss_feed_url => (@pg && @pg.id ? url_for(:action => 'rss_feed', :page_id => @pg.id,
|
128
|
+
:page_list_name => name) : nil))
|
129
|
+
if page_subset.empty?
|
130
|
+
content << substitute_placeholders(first_non_empty(@page_objects["#{key}-empty_message"],
|
131
|
+
options[:empty_message],
|
132
|
+
'No pages found.'), @pg)
|
133
|
+
else
|
134
|
+
page_subset.each_with_index do |page, index|
|
135
|
+
content << substitute_placeholders(first_non_empty(@page_objects["#{key}-template"], options[:template], ''), page,
|
136
|
+
:index => index+1, :count => page_subset.size, :total => pages.size)
|
96
137
|
end
|
97
138
|
end
|
98
139
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
# Convert from GMT/UTC to local time (based on time zone setting in session[:time_zone])
|
130
|
-
def gm_to_local(time)
|
131
|
-
ActiveSupport::TimeZone.new(session[:time_zone] || 'UTC').utc_to_local(time)
|
132
|
-
end
|
133
|
-
|
134
|
-
# Convert from local time to GMT/UTC (based on time zone setting in session[:time_zone])
|
135
|
-
def local_to_gm(time)
|
136
|
-
ActiveSupport::TimeZone.new(session[:time_zone] || 'UTC').local_to_utc(time)
|
137
|
-
end
|
138
|
-
|
139
|
-
# Convert a time object into a formatted date/time string
|
140
|
-
def ts_to_str(ts)
|
141
|
-
return '' if ts == nil
|
142
|
-
gm_to_local(ts).strftime('%a %b %d, %Y') + ' at ' +
|
143
|
-
gm_to_local(ts).strftime('%I:%M%p').downcase + ' ' + (session[:time_zone_abbr] || '')
|
144
|
-
end
|
145
|
-
|
146
|
-
# Convert a time object into a formatted time string (no date)
|
147
|
-
def ts_to_time_str(ts)
|
148
|
-
return '' if ts == nil
|
149
|
-
gm_to_local(ts).strftime('%I:%M:%S%p').downcase
|
150
|
-
end
|
151
|
-
|
152
|
-
# Convert times to a standard format (e.g. 1:35pm)
|
153
|
-
def time_to_str(t, convert = true)
|
154
|
-
return '' if t == nil
|
155
|
-
if convert
|
156
|
-
gm_to_local(t).strftime("%I").to_i.to_s + gm_to_local(t).strftime(":%M%p").downcase
|
140
|
+
content << substitute_placeholders(first_non_empty(@page_objects["#{key}-footer"], options[:footer]), @pg,
|
141
|
+
:count => page_subset.size, :total => pages.size,
|
142
|
+
:rss_feed_url => (@pg && @pg.id ? url_for(:action => 'rss_feed', :page_id => @pg.id,
|
143
|
+
:page_list_name => name) : nil))
|
144
|
+
|
145
|
+
num_segments = (pages.size.to_f / limit).ceil
|
146
|
+
if @page_objects["#{key}-use-pagination"].to_i == 1 && num_segments > 1
|
147
|
+
content << '<table style="margin-top: 4px;" align="right" cellpadding="0" cellspacing="0" border="0"><tr valign="bottom">'
|
148
|
+
content << '<td>Page: </td>'
|
149
|
+
num_segments.times do |seg|
|
150
|
+
start = seg * limit
|
151
|
+
content << "<td><div"
|
152
|
+
if offset >= start && offset < (start + limit)
|
153
|
+
content << " class=\"page_list_segment page_list_segment_selected\""
|
154
|
+
else
|
155
|
+
content << " class=\"page_list_segment\""
|
156
|
+
content << " onmouseover=\"this.className = 'page_list_segment page_list_segment_selected'\""
|
157
|
+
content << " onmouseout=\"this.className = 'page_list_segment'\""
|
158
|
+
content << " onclick=\"this.style.cursor = 'wait';"
|
159
|
+
content << remote_function(:update => key, :url => { :content_path => @pg.path.split('/').concat([ 'segment', start.to_s, name ]) })
|
160
|
+
content << "; return false;\""
|
161
|
+
end
|
162
|
+
content << ">#{seg+1}</div></td>"
|
163
|
+
end
|
164
|
+
content << '</tr></table>'
|
165
|
+
end
|
166
|
+
|
167
|
+
if options[:wrapper_div]
|
168
|
+
content_tag :div, erb_render(content), html_options.update(:id => key)
|
157
169
|
else
|
158
|
-
|
170
|
+
erb_render(content)
|
159
171
|
end
|
160
172
|
end
|
161
173
|
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
end
|
174
|
+
def erb_render(content, safe_level = 3, rethrow_exceptions = false)
|
175
|
+
# sanitize possibly dangerous content before rendering
|
176
|
+
content.gsub!(/<(%.*?(exec|system)\s?\(.*?\s*%)>/, '<\1>')
|
177
|
+
content.gsub!(/<(%.*?\%x\s?\[.*?\s*%)>/, '<\1>')
|
178
|
+
content.gsub!(/<(%.*?\`.*?\s*%)>/, '<\1>')
|
179
|
+
|
180
|
+
render_to_string(:inline => content.to_s).html_safe
|
170
181
|
end
|
171
182
|
|
172
183
|
end
|