porthos 3.0.0.beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +6 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +26 -0
- data/Rakefile +28 -0
- data/app/assets/images/Jcrop.gif +0 -0
- data/app/assets/images/button_grey_bg.png +0 -0
- data/app/assets/images/icons/avatar.png +0 -0
- data/app/assets/images/icons/filetypes/ai.png +0 -0
- data/app/assets/images/icons/filetypes/default.png +0 -0
- data/app/assets/images/icons/filetypes/doc.png +0 -0
- data/app/assets/images/icons/filetypes/eps.png +0 -0
- data/app/assets/images/icons/filetypes/mp3.png +0 -0
- data/app/assets/images/icons/filetypes/pdf.png +0 -0
- data/app/assets/images/icons/filetypes/psd.png +0 -0
- data/app/assets/images/icons/filetypes/swf.png +0 -0
- data/app/assets/images/icons/filetypes/wav.png +0 -0
- data/app/assets/images/icons/filetypes/zip.png +0 -0
- data/app/assets/images/layout2_bg_shadow.png +0 -0
- data/app/assets/images/layout3_bg_shadow.png +0 -0
- data/app/assets/images/ui_new.png +0 -0
- data/app/assets/images/wymeditor/icons.png +0 -0
- data/app/assets/javascripts/admin.js +7 -0
- data/app/assets/javascripts/admin/assets.js +147 -0
- data/app/assets/javascripts/admin/editor.js +2 -0
- data/app/assets/javascripts/admin/helpers.js +169 -0
- data/app/assets/javascripts/admin/items.js +267 -0
- data/app/assets/javascripts/admin/nodes.js +73 -0
- data/app/assets/javascripts/admin/settings.js +1 -0
- data/app/assets/javascripts/admin_extension.js +0 -0
- data/app/assets/javascripts/lib/ckeditor/LICENSE.html +1334 -0
- data/app/assets/javascripts/lib/ckeditor/adapters/jquery.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/ckeditor.js +141 -0
- data/app/assets/javascripts/lib/ckeditor/ckeditor_basic.js +8 -0
- data/app/assets/javascripts/lib/ckeditor/ckeditor_basic_source.js +20 -0
- data/app/assets/javascripts/lib/ckeditor/config.js +26 -0
- data/app/assets/javascripts/lib/ckeditor/contents.css +50 -0
- data/app/assets/javascripts/lib/ckeditor/images/spacer.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/lang/_languages.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/lang/_translationstatus.txt +60 -0
- data/app/assets/javascripts/lib/ckeditor/lang/en.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/lang/sv.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js +7 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/a11yhelp/lang/en.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/a11yhelp/lang/he.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/about/dialogs/about.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/about/dialogs/logo_ckeditor.png +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/adobeair/plugin.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/autogrow/plugin.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/clipboard/dialogs/paste.js +7 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/colordialog/dialogs/colordialog.js +7 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/dialog/dialogDefinition.js +4 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/div/dialogs/div.js +8 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/find/dialogs/find.js +9 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/flash/dialogs/flash.js +9 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/flash/images/placeholder.png +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/forms/dialogs/button.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/forms/dialogs/checkbox.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/forms/dialogs/form.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/forms/dialogs/hiddenfield.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/forms/dialogs/radio.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/forms/dialogs/select.js +9 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/forms/dialogs/textarea.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/forms/dialogs/textfield.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/forms/images/hiddenfield.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/iframe/dialogs/iframe.js +7 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/iframe/images/placeholder.png +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/iframedialog/plugin.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/image/dialogs/image.js +13 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/link/dialogs/anchor.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/link/dialogs/link.js +11 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/link/images/anchor.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/liststyle/dialogs/liststyle.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/pagebreak/images/pagebreak.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/pastefromword/filter/default.js +10 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/pastetext/dialogs/pastetext.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/placeholder/dialogs/placeholder.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/placeholder/lang/en.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/placeholder/placeholder.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/placeholder/plugin.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/scayt/dialogs/options.js +8 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/scayt/dialogs/toolbar.css +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/showblocks/images/block_address.png +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/showblocks/images/block_blockquote.png +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/showblocks/images/block_div.png +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/showblocks/images/block_h1.png +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/showblocks/images/block_h2.png +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/showblocks/images/block_h3.png +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/showblocks/images/block_h4.png +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/showblocks/images/block_h5.png +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/showblocks/images/block_h6.png +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/showblocks/images/block_p.png +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/showblocks/images/block_pre.png +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/smiley/dialogs/smiley.js +7 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/angel_smile.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/angry_smile.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/broken_heart.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/confused_smile.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/cry_smile.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/devil_smile.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/embaressed_smile.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/envelope.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/heart.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/kiss.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/lightbulb.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/omg_smile.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/regular_smile.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/sad_smile.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/shades_smile.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/teeth_smile.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/thumbs_down.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/thumbs_up.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/tounge_smile.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/wink_smile.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/specialchar/dialogs/specialchar.js +7 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/specialchar/lang/en.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/styles/styles/default.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/table/dialogs/table.js +9 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/tableresize/plugin.js +7 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/tabletools/dialogs/tableCell.js +8 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/templates/dialogs/templates.js +7 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/templates/templates/default.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/templates/templates/images/template1.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/templates/templates/images/template2.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/templates/templates/images/template3.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/uicolor/dialogs/uicolor.js +7 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/uicolor/lang/en.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/uicolor/lang/he.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/uicolor/plugin.js +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/uicolor/uicolor.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/uicolor/yui/assets/hue_bg.png +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/uicolor/yui/assets/hue_thumb.png +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/uicolor/yui/assets/picker_mask.png +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/uicolor/yui/assets/picker_thumb.png +0 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/uicolor/yui/assets/yui.css +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/uicolor/yui/yui.js +76 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/wsc/dialogs/ciframe.html +49 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/wsc/dialogs/tmpFrameset.html +52 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/wsc/dialogs/wsc.css +6 -0
- data/app/assets/javascripts/lib/ckeditor/plugins/wsc/dialogs/wsc.js +7 -0
- data/app/assets/javascripts/lib/ckeditor/skins/kama/dialog.css +515 -0
- data/app/assets/javascripts/lib/ckeditor/skins/kama/editor.css +1115 -0
- data/app/assets/javascripts/lib/ckeditor/skins/kama/icons.png +0 -0
- data/app/assets/javascripts/lib/ckeditor/skins/kama/icons_rtl.png +0 -0
- data/app/assets/javascripts/lib/ckeditor/skins/kama/images/dialog_sides.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/skins/kama/images/dialog_sides.png +0 -0
- data/app/assets/javascripts/lib/ckeditor/skins/kama/images/dialog_sides_rtl.png +0 -0
- data/app/assets/javascripts/lib/ckeditor/skins/kama/images/mini.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/skins/kama/images/noimage.png +0 -0
- data/app/assets/javascripts/lib/ckeditor/skins/kama/images/sprites.png +0 -0
- data/app/assets/javascripts/lib/ckeditor/skins/kama/images/sprites_ie6.png +0 -0
- data/app/assets/javascripts/lib/ckeditor/skins/kama/images/toolbar_start.gif +0 -0
- data/app/assets/javascripts/lib/ckeditor/skins/kama/skin.js +7 -0
- data/app/assets/javascripts/lib/ckeditor/skins/kama/templates.css +65 -0
- data/app/assets/javascripts/lib/ckeditor/themes/default/theme.js +8 -0
- data/app/assets/javascripts/lib/jquery-1.6.1.min.js +18 -0
- data/app/assets/javascripts/lib/jquery-ui-1.8.13.min.js +407 -0
- data/app/assets/javascripts/lib/jquery.jcrop.min.js +246 -0
- data/app/assets/javascripts/lib/jquery.smart_autocomplete.js +519 -0
- data/app/assets/javascripts/lib/underscore.min.js +26 -0
- data/app/assets/javascripts/lib/underscore.string.min.js +8 -0
- data/app/assets/javascripts/rails.js +148 -0
- data/app/assets/stylesheets/admin.css +9 -0
- data/app/assets/stylesheets/admin_extensions.css.scss +0 -0
- data/app/assets/stylesheets/clearing.css +28 -0
- data/app/assets/stylesheets/elements.css.erb +335 -0
- data/app/assets/stylesheets/forms.css.scss +118 -0
- data/app/assets/stylesheets/jquery.jcrop.css +28 -0
- data/app/assets/stylesheets/layout.css.erb +269 -0
- data/app/assets/stylesheets/views/assets.css.erb +112 -0
- data/app/assets/stylesheets/views/nodes.css +47 -0
- data/app/assets/stylesheets/views/pages.css.scss +136 -0
- data/app/assets/stylesheets/views/sessions.css +22 -0
- data/app/assets/stylesheets/views/tags.css +15 -0
- data/app/assets/stylesheets/views/users.css +16 -0
- data/app/controllers/admin/assets_controller.rb +132 -0
- data/app/controllers/admin/content_templates_controller.rb +56 -0
- data/app/controllers/admin/data_controller.rb +93 -0
- data/app/controllers/admin/datum_templates_controller.rb +59 -0
- data/app/controllers/admin/items_controller.rb +114 -0
- data/app/controllers/admin/link_lists_controller.rb +41 -0
- data/app/controllers/admin/links_controller.rb +65 -0
- data/app/controllers/admin/nodes_controller.rb +114 -0
- data/app/controllers/admin/page_templates_controller.rb +56 -0
- data/app/controllers/admin/redirects_controller.rb +58 -0
- data/app/controllers/admin/sessions_controller.rb +27 -0
- data/app/controllers/admin/site_settings_controller.rb +58 -0
- data/app/controllers/admin/tags_controller.rb +71 -0
- data/app/controllers/admin/users_controller.rb +55 -0
- data/app/controllers/application_controller.rb +8 -0
- data/app/controllers/pages_controller.rb +115 -0
- data/app/helpers/data_helper.rb +11 -0
- data/app/helpers/link_lists_helper.rb +16 -0
- data/app/models/asset.rb +189 -0
- data/app/models/custom_page.rb +33 -0
- data/app/models/data/asset_association.rb +73 -0
- data/app/models/data/datum_collection.rb +46 -0
- data/app/models/data/field.rb +26 -0
- data/app/models/data/field_set.rb +37 -0
- data/app/models/data/link_field.rb +7 -0
- data/app/models/data/page_association.rb +26 -0
- data/app/models/data/string_field.rb +13 -0
- data/app/models/datum.rb +22 -0
- data/app/models/datum_template.rb +143 -0
- data/app/models/datum_templates/asset_association_template.rb +3 -0
- data/app/models/datum_templates/association_field_template.rb +2 -0
- data/app/models/datum_templates/datum_collection_template.rb +15 -0
- data/app/models/datum_templates/field_set_template.rb +5 -0
- data/app/models/datum_templates/field_template.rb +6 -0
- data/app/models/datum_templates/link_field_template.rb +2 -0
- data/app/models/datum_templates/page_association_template.rb +4 -0
- data/app/models/datum_templates/string_field_template.rb +4 -0
- data/app/models/file_template.rb +105 -0
- data/app/models/file_templates/field_set_file_template.rb +7 -0
- data/app/models/file_templates/page_file_template.rb +14 -0
- data/app/models/image_asset.rb +102 -0
- data/app/models/item.rb +115 -0
- data/app/models/link.rb +46 -0
- data/app/models/link_list.rb +30 -0
- data/app/models/node.rb +106 -0
- data/app/models/observers/node_observer.rb +9 -0
- data/app/models/page.rb +167 -0
- data/app/models/redirect.rb +16 -0
- data/app/models/section.rb +30 -0
- data/app/models/setting.rb +4 -0
- data/app/models/site_setting.rb +11 -0
- data/app/models/template.rb +25 -0
- data/app/models/templates/content_template.rb +101 -0
- data/app/models/templates/page_template.rb +59 -0
- data/app/models/user.rb +67 -0
- data/app/views/admin/assets/_create_callback_form.html.erb +11 -0
- data/app/views/admin/assets/_sub_nav.html.erb +45 -0
- data/app/views/admin/assets/create.html.erb +10 -0
- data/app/views/admin/assets/edit.html.erb +91 -0
- data/app/views/admin/assets/edit_cropping.html.erb +44 -0
- data/app/views/admin/assets/incomplete.html.erb +39 -0
- data/app/views/admin/assets/index.html.erb +76 -0
- data/app/views/admin/assets/new.html.erb +20 -0
- data/app/views/admin/assets/search.html.erb +60 -0
- data/app/views/admin/assets/show.html.erb +45 -0
- data/app/views/admin/content_templates/_form.html.erb +18 -0
- data/app/views/admin/content_templates/edit.html.erb +14 -0
- data/app/views/admin/content_templates/index.html.erb +36 -0
- data/app/views/admin/content_templates/new.html.erb +14 -0
- data/app/views/admin/content_templates/show.html.erb +57 -0
- data/app/views/admin/data/_asset_association.html.erb +59 -0
- data/app/views/admin/data/_asset_association_form.html.erb +21 -0
- data/app/views/admin/data/_field.html.erb +7 -0
- data/app/views/admin/data/_field_form.html.erb +27 -0
- data/app/views/admin/data/_field_set.html.erb +7 -0
- data/app/views/admin/data/_field_set_form.html.erb +14 -0
- data/app/views/admin/data/_form.html.erb +14 -0
- data/app/views/admin/data/_link_field.html.erb +9 -0
- data/app/views/admin/data/_link_field_form.html.erb +22 -0
- data/app/views/admin/data/_page_association.html.erb +3 -0
- data/app/views/admin/data/_page_association_form.html.erb +8 -0
- data/app/views/admin/data/edit.html.erb +20 -0
- data/app/views/admin/data/index.html.erb +61 -0
- data/app/views/admin/data/new.html.erb +20 -0
- data/app/views/admin/datum_templates/_asset_association_template_form.html.erb +2 -0
- data/app/views/admin/datum_templates/_datum_collection_template_form.html.erb +23 -0
- data/app/views/admin/datum_templates/_field_set_template_form.html.erb +7 -0
- data/app/views/admin/datum_templates/_field_template_form.html.erb +1 -0
- data/app/views/admin/datum_templates/_form.html.erb +25 -0
- data/app/views/admin/datum_templates/_page_association_template_form.html.erb +2 -0
- data/app/views/admin/datum_templates/_string_field_template_form.html.erb +12 -0
- data/app/views/admin/datum_templates/edit.html.erb +14 -0
- data/app/views/admin/datum_templates/new.html.erb +14 -0
- data/app/views/admin/items/_asset_association.html.erb +6 -0
- data/app/views/admin/items/_details.html.erb +95 -0
- data/app/views/admin/items/_form.html.erb +20 -0
- data/app/views/admin/items/_page_form.html.erb +27 -0
- data/app/views/admin/items/_row.html.erb +47 -0
- data/app/views/admin/items/_sub_nav.html.erb +60 -0
- data/app/views/admin/items/index.html.erb +75 -0
- data/app/views/admin/items/new.html.erb +5 -0
- data/app/views/admin/items/page.html.erb +155 -0
- data/app/views/admin/items/search.html.erb +26 -0
- data/app/views/admin/items/section.html.erb +152 -0
- data/app/views/admin/link_lists/_form.html.erb +8 -0
- data/app/views/admin/link_lists/edit.html.erb +11 -0
- data/app/views/admin/link_lists/show.html.erb +45 -0
- data/app/views/admin/links/_form.html.erb +14 -0
- data/app/views/admin/links/edit.html.erb +11 -0
- data/app/views/admin/links/new.html.erb +11 -0
- data/app/views/admin/nodes/_form.html.erb +88 -0
- data/app/views/admin/nodes/_list_of_nodes.html.erb +11 -0
- data/app/views/admin/nodes/_node.html.erb +23 -0
- data/app/views/admin/nodes/_nodes_tree.html.erb +7 -0
- data/app/views/admin/nodes/_place_node.html.erb +11 -0
- data/app/views/admin/nodes/_sub_nav.html.erb +12 -0
- data/app/views/admin/nodes/edit.html.erb +10 -0
- data/app/views/admin/nodes/index.html.erb +26 -0
- data/app/views/admin/nodes/new.html.erb +10 -0
- data/app/views/admin/nodes/place.html.erb +37 -0
- data/app/views/admin/page_templates/_form.html.erb +51 -0
- data/app/views/admin/page_templates/edit.html.erb +14 -0
- data/app/views/admin/page_templates/index.html.erb +42 -0
- data/app/views/admin/page_templates/new.html.erb +14 -0
- data/app/views/admin/page_templates/pages.html.erb +28 -0
- data/app/views/admin/page_templates/show.html.erb +64 -0
- data/app/views/admin/redirects/edit.html.erb +25 -0
- data/app/views/admin/redirects/index.html.erb +38 -0
- data/app/views/admin/redirects/new.html.erb +25 -0
- data/app/views/admin/sessions/new.html.erb +17 -0
- data/app/views/admin/sessions/token.js.erb +1 -0
- data/app/views/admin/shared/_error_messages.html.erb +7 -0
- data/app/views/admin/shared/_settings_sub_nav.html.erb +8 -0
- data/app/views/admin/site_settings/_form.html.erb +5 -0
- data/app/views/admin/site_settings/edit.html.erb +20 -0
- data/app/views/admin/site_settings/index.html.erb +45 -0
- data/app/views/admin/site_settings/new.html.erb +20 -0
- data/app/views/admin/taggables/_asset.html.erb +10 -0
- data/app/views/admin/taggables/_page.html.erb +9 -0
- data/app/views/admin/taggables/_tag_collection.html.erb +2 -0
- data/app/views/admin/tags/edit.html.erb +18 -0
- data/app/views/admin/tags/index.html.erb +34 -0
- data/app/views/admin/tags/new.html.erb +18 -0
- data/app/views/admin/tags/search.js.erb +5 -0
- data/app/views/admin/tags/show.html.erb +29 -0
- data/app/views/admin/users/_form.html.erb +22 -0
- data/app/views/admin/users/_sub_nav.html.erb +12 -0
- data/app/views/admin/users/_user.html.erb +23 -0
- data/app/views/admin/users/edit.html.erb +18 -0
- data/app/views/admin/users/index.html.erb +22 -0
- data/app/views/admin/users/new.html.erb +15 -0
- data/app/views/admin/users/search.html.erb +19 -0
- data/app/views/field_set_templates/default/_show.html.erb +6 -0
- data/app/views/layouts/admin/_account_nav.html.erb +7 -0
- data/app/views/layouts/admin/_main_nav.html.erb +8 -0
- data/app/views/layouts/admin/application.html.erb +26 -0
- data/app/views/layouts/admin/sessions.html.erb +18 -0
- data/app/views/pages/_preview.html.erb +13 -0
- data/app/views/pages/contents/content_images/_collection.html.erb +26 -0
- data/app/views/pages/contents/content_images/_content_image.html.erb +19 -0
- data/app/views/pages/contents/content_teasers/_collection.html.erb +8 -0
- data/app/views/pages/contents/content_teasers/_content_teaser.html.erb +32 -0
- data/app/views/pages/contents/content_textfields/_content_textfield.html.erb +1 -0
- data/app/views/pages/contents/content_videos/_content_video.html.erb +1 -0
- data/app/views/pages/contents/modules/date_archive/_content.html.erb +23 -0
- data/app/views/pages/contents/modules/sub_navigation/_content.html.erb +5 -0
- data/app/views/pages/templates/default/_admin_in_list.html.erb +4 -0
- data/app/views/pages/templates/default/categories.html.erb +13 -0
- data/app/views/pages/templates/default/category.html.erb +13 -0
- data/app/views/pages/templates/default/default_renderer.rb +115 -0
- data/app/views/pages/templates/default/index.html.erb +13 -0
- data/app/views/pages/templates/default/index.rss.builder +19 -0
- data/app/views/pages/templates/default/search.html.erb +24 -0
- data/app/views/pages/templates/default/show.html.erb +6 -0
- data/app/views/shared/404.html.erb +1 -0
- data/config/initializers/locale.rb +1 -0
- data/config/initializers/mime_types.rb +13 -0
- data/config/initializers/overrides.rb +34 -0
- data/config/initializers/tanker.rb +1 -0
- data/config/locales/sv-SE.yml +543 -0
- data/config/routes.rb +97 -0
- data/lib/generators/porthos/USAGE +3 -0
- data/lib/generators/porthos/porthos_generator.rb +35 -0
- data/lib/generators/porthos/templates/mongo.yml +15 -0
- data/lib/porthos.rb +53 -0
- data/lib/porthos/active_record/restrictions.rb +36 -0
- data/lib/porthos/active_record/settingable.rb +49 -0
- data/lib/porthos/admin.rb +25 -0
- data/lib/porthos/authentication.rb +72 -0
- data/lib/porthos/config.rb +18 -0
- data/lib/porthos/datum_methods.rb +53 -0
- data/lib/porthos/engine.rb +56 -0
- data/lib/porthos/helpers/application_helper.rb +140 -0
- data/lib/porthos/mongo_mapper/acts_as_uri.rb +59 -0
- data/lib/porthos/mongo_mapper/callbacks.rb +13 -0
- data/lib/porthos/mongo_mapper/extensions.rb +58 -0
- data/lib/porthos/mongo_mapper/instructable.rb +36 -0
- data/lib/porthos/mongo_mapper/observer.rb +34 -0
- data/lib/porthos/mongo_mapper/taggable.rb +136 -0
- data/lib/porthos/page_renderer.rb +66 -0
- data/lib/porthos/public.rb +56 -0
- data/lib/porthos/redirects.rb +23 -0
- data/lib/porthos/routing.rb +256 -0
- data/lib/porthos/s3_storage.rb +61 -0
- data/lib/porthos/tags_autocomplete_app.rb +32 -0
- data/lib/porthos/tanking.rb +9 -0
- data/lib/porthos/test_helpers/assets_test_helper.rb +72 -0
- data/lib/porthos/test_helpers/pages_test_helper.rb +9 -0
- data/lib/porthos/url_resolver.rb +108 -0
- data/lib/porthos/validators.rb +14 -0
- data/lib/porthos/version.rb +3 -0
- data/lib/tasks/porthos_tasks.rake +217 -0
- metadata +774 -0
data/config/routes.rb
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
Rails.application.routes.draw do
|
|
2
|
+
mount TagsAutocompleteApp.instance => '/admin/tags/autocomplete'
|
|
3
|
+
|
|
4
|
+
filter :url_resolver
|
|
5
|
+
|
|
6
|
+
resources :pages do
|
|
7
|
+
collection do
|
|
8
|
+
get 'categories'
|
|
9
|
+
end
|
|
10
|
+
member do
|
|
11
|
+
get 'preview'
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
match 'pages/categories/:id' => 'pages#category', :as => 'pages_category'
|
|
15
|
+
|
|
16
|
+
namespace :admin do
|
|
17
|
+
root :to => 'items#index'
|
|
18
|
+
match 'login' => 'sessions#new', :as => 'login'
|
|
19
|
+
match '/logout' => 'sessions#destroy', :as => 'logout'
|
|
20
|
+
resources :sessions
|
|
21
|
+
resources :users do
|
|
22
|
+
collection do
|
|
23
|
+
get 'admins'
|
|
24
|
+
get 'search'
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
resources :site_settings
|
|
29
|
+
resources :redirects
|
|
30
|
+
resources :tags
|
|
31
|
+
|
|
32
|
+
resources :nodes do
|
|
33
|
+
member do
|
|
34
|
+
get 'place'
|
|
35
|
+
end
|
|
36
|
+
collection do
|
|
37
|
+
put 'sort'
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
resources :link_lists do
|
|
42
|
+
resources :links do
|
|
43
|
+
collection do
|
|
44
|
+
put 'sort'
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
resources :templates do
|
|
50
|
+
resources :datum_templates do
|
|
51
|
+
collection do
|
|
52
|
+
put 'sort'
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
resources :page_templates do
|
|
57
|
+
collection do
|
|
58
|
+
put 'sort'
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
resources :content_templates do
|
|
62
|
+
collection do
|
|
63
|
+
put 'sort'
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
resources :items do
|
|
68
|
+
collection do
|
|
69
|
+
get 'search'
|
|
70
|
+
put 'sort'
|
|
71
|
+
end
|
|
72
|
+
member do
|
|
73
|
+
put 'toggle'
|
|
74
|
+
end
|
|
75
|
+
resources :data do
|
|
76
|
+
collection do
|
|
77
|
+
put 'sort'
|
|
78
|
+
end
|
|
79
|
+
member do
|
|
80
|
+
put 'toggle'
|
|
81
|
+
get 'settings'
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
resources :assets do
|
|
87
|
+
collection do
|
|
88
|
+
get 'search'
|
|
89
|
+
get 'incomplete'
|
|
90
|
+
put 'update_multiple'
|
|
91
|
+
end
|
|
92
|
+
member do
|
|
93
|
+
get 'edit_cropping'
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
class PorthosGenerator < Rails::Generators::Base
|
|
2
|
+
source_root File.expand_path("../templates", __FILE__)
|
|
3
|
+
|
|
4
|
+
def application_name
|
|
5
|
+
Rails.application.class.name.split('::').first
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def create_initializer_file
|
|
9
|
+
initializer 'porthos.rb', <<-FILE
|
|
10
|
+
Porthos.s3_storage = Porthos::S3Storage.new({
|
|
11
|
+
:bucket_name => "porthos-assets",
|
|
12
|
+
:access_key_id => '',
|
|
13
|
+
:secret_access_key => ''
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
Porthos.configure do |config|
|
|
17
|
+
config.observers = :node_observer
|
|
18
|
+
|
|
19
|
+
config.resizor do |resizor|
|
|
20
|
+
resizor.api_key = ''
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
config.tanking do |tanking|
|
|
24
|
+
tanking.index_name = "#{Rails.env}_#{application_name.underscore}".downcase
|
|
25
|
+
tanking.private_url = ''
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
#{application_name}::Application.config.index_tank_url = Porthos.config.tanking.private_url
|
|
29
|
+
FILE
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def create_config_file
|
|
33
|
+
copy_file 'mongo.yml', 'config/mongo.yml'
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
defaults: &defaults
|
|
2
|
+
host: 127.0.0.1
|
|
3
|
+
port: 27017
|
|
4
|
+
|
|
5
|
+
development:
|
|
6
|
+
<<: *defaults
|
|
7
|
+
database: porthos-development
|
|
8
|
+
|
|
9
|
+
test:
|
|
10
|
+
<<: *defaults
|
|
11
|
+
database: porthos-test
|
|
12
|
+
|
|
13
|
+
# set these environment variables on your prod server
|
|
14
|
+
production:
|
|
15
|
+
uri: <%= ENV['MONGOHQ_URL'] %>
|
data/lib/porthos.rb
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
require 'bcrypt'
|
|
2
|
+
require 'warden'
|
|
3
|
+
require 'resizor'
|
|
4
|
+
require 'has_scope'
|
|
5
|
+
require 's3'
|
|
6
|
+
require 'mongo_mapper_tree'
|
|
7
|
+
require 'mm-multi-parameter-attributes'
|
|
8
|
+
require 'delayed_job'
|
|
9
|
+
require 'kaminari'
|
|
10
|
+
|
|
11
|
+
require 'porthos/config'
|
|
12
|
+
module Porthos
|
|
13
|
+
extend self
|
|
14
|
+
|
|
15
|
+
def root
|
|
16
|
+
Pathname.new(File.expand_path(File.dirname(__FILE__)+'../..'))
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def app_name
|
|
20
|
+
Rails.application.class.to_s.split("::").first
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def configure
|
|
24
|
+
yield Porthos::Config
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def config
|
|
28
|
+
Porthos::Config
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
require 'porthos/validators'
|
|
34
|
+
require 'porthos/redirects'
|
|
35
|
+
require 'porthos/routing'
|
|
36
|
+
require 'porthos/url_resolver'
|
|
37
|
+
require 'porthos/authentication'
|
|
38
|
+
require 'porthos/helpers/application_helper'
|
|
39
|
+
require 'porthos/admin'
|
|
40
|
+
require 'porthos/public'
|
|
41
|
+
require 'porthos/s3_storage'
|
|
42
|
+
require 'porthos/active_record/restrictions'
|
|
43
|
+
require 'porthos/active_record/settingable'
|
|
44
|
+
require 'porthos/mongo_mapper/extensions'
|
|
45
|
+
require 'porthos/mongo_mapper/callbacks'
|
|
46
|
+
require 'porthos/mongo_mapper/observer'
|
|
47
|
+
require 'porthos/mongo_mapper/taggable'
|
|
48
|
+
require 'porthos/mongo_mapper/instructable'
|
|
49
|
+
require 'porthos/mongo_mapper/acts_as_uri'
|
|
50
|
+
require 'porthos/datum_methods'
|
|
51
|
+
require 'porthos/tags_autocomplete_app'
|
|
52
|
+
require 'porthos/tanking'
|
|
53
|
+
require 'porthos/engine'
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
module Porthos
|
|
2
|
+
module ActiveRecord
|
|
3
|
+
module Restrictions
|
|
4
|
+
extend ActiveSupport::Concern
|
|
5
|
+
|
|
6
|
+
module InstanceMethods
|
|
7
|
+
def can_be_created_by?(user)
|
|
8
|
+
self.class.can_be_created_by?(user)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def can_be_edited_by?(user)
|
|
12
|
+
self.class.can_be_edited_by?(user)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def can_be_destroyed_by?(user)
|
|
16
|
+
self.class.can_be_destroyed_by?(user)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
module ClassMethods
|
|
21
|
+
def can_be_created_by?(user)
|
|
22
|
+
true
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def can_be_edited_by?(user)
|
|
26
|
+
true
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def can_be_destroyed_by?(user)
|
|
30
|
+
true
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
module Porthos
|
|
2
|
+
module ActiveRecord
|
|
3
|
+
module Settingable
|
|
4
|
+
|
|
5
|
+
def self.included(base)
|
|
6
|
+
base.extend(ClassMethods)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
module ClassMethods
|
|
10
|
+
def acts_as_settingable(options = {})
|
|
11
|
+
has_many :settings, :as => :settingable, :dependent => :destroy do
|
|
12
|
+
def value_for(name)
|
|
13
|
+
if setting = find_by_name(name.to_s)
|
|
14
|
+
setting.value
|
|
15
|
+
else
|
|
16
|
+
nil
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
def to_array
|
|
20
|
+
ret = {}
|
|
21
|
+
find(:all).each {|setting| ret[setting.name.to_sym] = setting.value } and return ret
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
attr_accessor :new_settings
|
|
26
|
+
|
|
27
|
+
include ActiveRecord::Acts::Settingable::InstanceMethods
|
|
28
|
+
before_save :save_new_settings
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
module InstanceMethods
|
|
33
|
+
protected
|
|
34
|
+
def save_new_settings
|
|
35
|
+
if respond_to?(:new_settings) and new_settings and new_settings.any?
|
|
36
|
+
new_settings.each do |key, value|
|
|
37
|
+
if setting = settings.find_by_name(key)
|
|
38
|
+
setting.update_attribute(:value, value)
|
|
39
|
+
else
|
|
40
|
+
settings.build(:name => key, :value => value)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Porthos
|
|
2
|
+
module Admin
|
|
3
|
+
extend ActiveSupport::Concern
|
|
4
|
+
|
|
5
|
+
module InstanceMethods
|
|
6
|
+
def clear_callback
|
|
7
|
+
session.delete(:create_callback) if !params[:create_callback] && session[:create_callback]
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def set_current_user
|
|
11
|
+
User.current = current_user if signed_in?
|
|
12
|
+
yield
|
|
13
|
+
User.current = nil
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
included do
|
|
18
|
+
before_filter :authenticate!
|
|
19
|
+
before_filter :clear_callback
|
|
20
|
+
around_filter :set_current_user
|
|
21
|
+
layout 'admin/application'
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
require 'warden'
|
|
2
|
+
Warden::Manager.serialize_into_session do |user|
|
|
3
|
+
user.id
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
Warden::Manager.serialize_from_session do |id|
|
|
7
|
+
User.find(id)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
Warden::Strategies.add(:password) do
|
|
11
|
+
def valid?
|
|
12
|
+
params['username'] || params['password']
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def authenticate!
|
|
16
|
+
u = User.authenticate(params['username'], params['password'])
|
|
17
|
+
u.nil? ? fail!("Could not log in") : success!(u)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
module Porthos
|
|
22
|
+
module Authentication
|
|
23
|
+
module Helpers
|
|
24
|
+
extend ActiveSupport::Concern
|
|
25
|
+
|
|
26
|
+
included do
|
|
27
|
+
helper_method :warden, :signed_in?, :current_user
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
module InstanceMethods
|
|
31
|
+
def warden
|
|
32
|
+
env['warden']
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def signed_in?(*args)
|
|
36
|
+
warden.authenticated?(*args)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def current_user(*args)
|
|
40
|
+
warden.user(*args)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def sign_in(*args)
|
|
44
|
+
warden.set_user(*args)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def sign_out(*args)
|
|
48
|
+
warden.logout(*args)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def authenticate(*args)
|
|
52
|
+
warden.authenticate(*args)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def authenticate!(*args)
|
|
56
|
+
warden.authenticate!(*args)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
class UnauthorizedRequest < ActionController::Base
|
|
62
|
+
def self.call(env)
|
|
63
|
+
action(:redirect).call(env)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def redirect
|
|
67
|
+
flash[:error] = I18n.t(:'admin.sessions.failed') if params['username'] || params['password']
|
|
68
|
+
redirect_to '/admin/login'
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Porthos
|
|
2
|
+
module Config
|
|
3
|
+
include ActiveModel::Observing
|
|
4
|
+
extend self
|
|
5
|
+
|
|
6
|
+
def resizor(&block)
|
|
7
|
+
Resizor.configure(&block)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def tanking
|
|
11
|
+
if block_given?
|
|
12
|
+
yield Porthos::Tanking::Config
|
|
13
|
+
else
|
|
14
|
+
Porthos::Tanking::Config
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
module Porthos
|
|
2
|
+
module DatumMethods
|
|
3
|
+
extend ActiveSupport::Concern
|
|
4
|
+
|
|
5
|
+
included do
|
|
6
|
+
plugin Porthos::MongoMapper::Plugins::Instructable
|
|
7
|
+
key :label, String
|
|
8
|
+
key :handle, String
|
|
9
|
+
key :required, Boolean, :default => lambda { false }
|
|
10
|
+
key :position, Integer, :default => lambda { 0 }
|
|
11
|
+
|
|
12
|
+
before_validation :parameterize_handle
|
|
13
|
+
before_validation :move_to_list_bottom
|
|
14
|
+
|
|
15
|
+
validates_presence_of :handle, :if => proc { |d| d.require_handle? }
|
|
16
|
+
validate :uniqueness_of_handle, :if => proc { |d| d.require_handle? }
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
module InstanceMethods
|
|
20
|
+
|
|
21
|
+
protected
|
|
22
|
+
|
|
23
|
+
def in_list?
|
|
24
|
+
_parent_document && _parent_document.respond_to?(list_name)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def list_name
|
|
28
|
+
_parent_document.kind_of?(Template) ? 'datum_templates' : 'data'
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def require_handle?
|
|
32
|
+
@require_handle ||= _parent_document && !(_parent_document.class.to_s.match(/DatumCollection/))
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def uniqueness_of_handle
|
|
36
|
+
if in_list? && _parent_document.send(list_name).detect { |d| d.id != self.id && d.handle == self.handle }
|
|
37
|
+
errors.add(:handle, :taken)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def parameterize_handle
|
|
42
|
+
self.handle = handle.parameterize('_') if handle.present?
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def move_to_list_bottom
|
|
46
|
+
if position.blank? && in_list?
|
|
47
|
+
siblings = _parent_document.send(list_name).find_all { |d| d.position.present? && d.id != self.id }
|
|
48
|
+
self.position = siblings.any? ? siblings.sort_by(&:position).last.position + 1 : 1
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|