lipsiadmin 2.9
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +90 -0
- data/MIT-LICENSE +20 -0
- data/README +60 -0
- data/Rakefile +90 -0
- data/init.rb +1 -0
- data/lib/access_control/authentication.rb +105 -0
- data/lib/access_control/base.rb +227 -0
- data/lib/controller/ext.rb +168 -0
- data/lib/controller/lipsiadmin_controller.rb +18 -0
- data/lib/controller/pdf_builder.rb +67 -0
- data/lib/controller/rescue.rb +72 -0
- data/lib/controller/responds_to_parent.rb +56 -0
- data/lib/data_base/attachment.rb +351 -0
- data/lib/data_base/attachment/attach.rb +515 -0
- data/lib/data_base/attachment/geometry.rb +117 -0
- data/lib/data_base/attachment/iostream.rb +62 -0
- data/lib/data_base/attachment/processor.rb +49 -0
- data/lib/data_base/attachment/storage.rb +223 -0
- data/lib/data_base/attachment/thumbnail.rb +72 -0
- data/lib/data_base/attachment/upfile.rb +45 -0
- data/lib/data_base/attachment_table.rb +142 -0
- data/lib/data_base/translate_attributes.rb +30 -0
- data/lib/data_base/utility_scopes.rb +40 -0
- data/lib/data_base/without_table.rb +62 -0
- data/lib/generator.rb +114 -0
- data/lib/lipsiadmin.rb +77 -0
- data/lib/lipsiadmin_tasks.rb +3 -0
- data/lib/locale/en.yml +16 -0
- data/lib/locale/it.yml +16 -0
- data/lib/mailer/exception/exception.html.erb +11 -0
- data/lib/mailer/exception_notifier.rb +46 -0
- data/lib/mailer/pdf_builder.rb +66 -0
- data/lib/utils/html_entities.rb +63 -0
- data/lib/utils/literal.rb +20 -0
- data/lib/version.rb +9 -0
- data/lib/view/helpers/active_record_helper.rb +11 -0
- data/lib/view/helpers/backend_helper.rb +132 -0
- data/lib/view/helpers/ext/column_model.rb +73 -0
- data/lib/view/helpers/ext/component.rb +163 -0
- data/lib/view/helpers/ext/configuration.rb +36 -0
- data/lib/view/helpers/ext/grid.rb +281 -0
- data/lib/view/helpers/ext/store.rb +103 -0
- data/lib/view/helpers/ext/templates/grid_functions.js.erb +51 -0
- data/lib/view/helpers/ext/tool_bar.rb +40 -0
- data/lib/view/helpers/ext_helper.rb +150 -0
- data/lib/view/helpers/view_helper.rb +222 -0
- data/lipsiadmin_generators/attachment/REMEMBER +21 -0
- data/lipsiadmin_generators/attachment/attachment_generator.rb +27 -0
- data/lipsiadmin_generators/attachment/templates/migration.rb +14 -0
- data/lipsiadmin_generators/attachment/templates/model.rb +4 -0
- data/lipsiadmin_generators/backend/REMEMBER +18 -0
- data/lipsiadmin_generators/backend/backend_generator.rb +58 -0
- data/lipsiadmin_generators/backend/templates/config/config.yml +14 -0
- data/lipsiadmin_generators/backend/templates/config/initializers/config.rb +7 -0
- data/lipsiadmin_generators/backend/templates/config/initializers/emails.rb +2 -0
- data/lipsiadmin_generators/backend/templates/config/initializers/exception_notifier.rb +7 -0
- data/lipsiadmin_generators/backend/templates/config/locales/backend/en.yml +204 -0
- data/lipsiadmin_generators/backend/templates/config/locales/backend/it.yml +203 -0
- data/lipsiadmin_generators/backend/templates/config/locales/frontend/en.yml +5 -0
- data/lipsiadmin_generators/backend/templates/config/locales/frontend/it.yml +5 -0
- data/lipsiadmin_generators/backend/templates/config/locales/models/en.yml +31 -0
- data/lipsiadmin_generators/backend/templates/config/locales/models/it.yml +23 -0
- data/lipsiadmin_generators/backend/templates/config/locales/rails/en.yml +148 -0
- data/lipsiadmin_generators/backend/templates/config/locales/rails/it.yml +109 -0
- data/lipsiadmin_generators/backend/templates/controllers/backend/accounts_controller.rb +53 -0
- data/lipsiadmin_generators/backend/templates/controllers/backend/base_controller.rb +8 -0
- data/lipsiadmin_generators/backend/templates/controllers/backend/sessions_controller.rb +21 -0
- data/lipsiadmin_generators/backend/templates/controllers/backend_controller.rb +2 -0
- data/lipsiadmin_generators/backend/templates/controllers/frontend_controller.rb +4 -0
- data/lipsiadmin_generators/backend/templates/controllers/javascripts_controller.rb +17 -0
- data/lipsiadmin_generators/backend/templates/exceptions/template.html.haml +5 -0
- data/lipsiadmin_generators/backend/templates/helpers/backend_helper.rb +2 -0
- data/lipsiadmin_generators/backend/templates/helpers/frontend_helper.rb +2 -0
- data/lipsiadmin_generators/backend/templates/images/backend/back.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/backend/background.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/backend/bg-content.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/backend/bg-hd-slate.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/backend/bg-hd.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/backend/bg-intro.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/backend/bg-login.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/backend/bg-menu-slate.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/backend/bg-menu.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/backend/bg.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/backend/btn-login.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/backend/delete.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/backend/download.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/backend/duplicate.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/backend/edit.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/backend/hd-bg-slate.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/backend/hd-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/backend/it.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/backend/loader.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/backend/logo-loader.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/backend/logo-small.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/backend/new.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/backend/no-image.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/backend/preview.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/backend/print.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/backend/save.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/backend/support.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/backend/us.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/box/corners-blue.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/box/corners.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/box/l-blue.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/box/l.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/box/r-blue.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/box/r.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/box/tb-blue.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/box/tb-slate.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/box/tb.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/button/btn-arrow.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/button/btn-sprite.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/dd/drop-add.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/dd/drop-no.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/dd/drop-yes.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/editor/tb-sprite.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/form/clear-trigger.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/form/clear-trigger.psd +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/form/date-trigger.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/form/date-trigger.psd +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/form/error-tip-corners.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/form/exclamation.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/form/search-trigger.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/form/search-trigger.psd +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/form/text-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/form/trigger-tpl.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/form/trigger.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/form/trigger.psd +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/gradient-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/Thumbs.db +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/arrow-left-white.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/arrow-right-white.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/col-move-bottom.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/col-move-top.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/columns.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/dirty.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/done.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/drop-no.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/drop-yes.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/footer-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/grid-blue-hd.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/grid-blue-split.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/grid-hrow.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/grid-loading.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/grid-split.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/grid-vista-hd.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/grid3-hd-btn.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/grid3-hrow-over.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/grid3-hrow.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/grid3-special-col-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/grid3-special-col-sel-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/group-by.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/group-expand-sprite.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/hd-pop.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/hmenu-asc.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/hmenu-desc.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/hmenu-lock.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/hmenu-lock.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/hmenu-unlock.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/hmenu-unlock.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/invalid_line.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/loading.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/mso-hd.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/nowait.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/page-first-disabled.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/page-first.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/page-last-disabled.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/page-last.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/page-next-disabled.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/page-next.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/page-prev-disabled.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/page-prev.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/pick-button.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/refresh.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/row-check-sprite.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/row-expand-sprite.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/row-over.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/row-sel.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/sort_asc.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/sort_desc.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/grid/wait.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/layout/collapse.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/layout/expand.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/layout/gradient-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/layout/mini-bottom.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/layout/mini-left.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/layout/mini-right.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/layout/mini-top.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/layout/ns-collapse.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/layout/ns-expand.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/layout/panel-close.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/layout/panel-title-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/layout/panel-title-light-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/layout/stick.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/layout/stuck.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/layout/tab-close-on.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/layout/tab-close.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/menu/checked.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/menu/group-checked.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/menu/item-over.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/menu/menu-parent.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/menu/menu.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/menu/unchecked.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/panel/corners-sprite.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/panel/left-right.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/panel/light-hd.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/panel/tool-sprite-tpl.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/panel/tool-sprites.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/panel/tools-sprites-trans.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/panel/top-bottom.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/panel/top-bottom.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/panel/white-corners-sprite.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/panel/white-left-right.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/panel/white-top-bottom.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/progress/progress-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/qtip/bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/qtip/close.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/qtip/tip-sprite.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/s.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/shadow-c.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/shadow-lr.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/shadow.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/shared/blue-loading.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/shared/calendar.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/shared/glass-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/shared/hd-sprite.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/shared/large-loading.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/shared/left-btn.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/shared/loading-balls.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/shared/right-btn.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/shared/warning.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/sizer/e-handle-dark.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/sizer/e-handle.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/sizer/ne-handle-dark.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/sizer/ne-handle.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/sizer/nw-handle-dark.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/sizer/nw-handle.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/sizer/s-handle-dark.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/sizer/s-handle.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/sizer/se-handle-dark.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/sizer/se-handle.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/sizer/square.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/sizer/sw-handle-dark.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/sizer/sw-handle.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/slider/slider-bg.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/slider/slider-thumb.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/slider/slider-v-bg.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/slider/slider-v-thumb.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tabs/scroll-left.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tabs/scroll-right.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tabs/scroller-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tabs/tab-btm-inactive-left-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tabs/tab-btm-inactive-right-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tabs/tab-btm-left-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tabs/tab-btm-right-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tabs/tab-close.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tabs/tab-strip-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tabs/tab-strip-bg.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tabs/tab-strip-btm-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tabs/tabs-sprite.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/toolbar/bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/toolbar/btn-arrow-light.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/toolbar/btn-arrow.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/toolbar/btn-over-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/toolbar/gray-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/toolbar/tb-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/toolbar/tb-btn-sprite.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tree/arrows.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tree/drop-add.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tree/drop-between.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tree/drop-no.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tree/drop-over.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tree/drop-under.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tree/drop-yes.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tree/elbow-end-minus-nl.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tree/elbow-end-minus.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tree/elbow-end-plus-nl.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tree/elbow-end-plus.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tree/elbow-end.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tree/elbow-line.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tree/elbow-minus-nl.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tree/elbow-minus.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tree/elbow-plus-nl.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tree/elbow-plus.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tree/elbow.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tree/folder-open.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tree/folder.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tree/leaf.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tree/loading.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/tree/s.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/window/icon-error.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/window/icon-info.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/window/icon-question.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/window/icon-warning.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/window/left-corners.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/window/left-corners.psd +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/window/left-right.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/window/left-right.psd +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/window/right-corners.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/window/right-corners.psd +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/window/top-bottom.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/default/window/top-bottom.psd +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/button/btn-arrow.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/button/btn-sprite.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/editor/tb-sprite.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/form/checkbox.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/form/clear-trigger.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/form/date-trigger.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/form/radio.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/form/search-trigger.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/form/trigger-tpl.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/form/trigger.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/gradient-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/arrow-left-white.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/arrow-right-white.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/col-move-bottom.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/col-move-top.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/footer-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/grid-blue-hd.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/grid-blue-split.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/grid-hrow.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/grid-split.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/grid-vista-hd.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/grid3-hd-btn.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/grid3-hrow-over.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/grid3-hrow.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/grid3-special-col-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/grid3-special-col-sel-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/group-expand-sprite.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/mso-hd.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/page-first-disabled.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/page-first.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/page-last-disabled.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/page-last.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/page-next-disabled.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/page-next.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/page-prev-disabled.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/page-prev.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/refresh.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/row-over.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/row-sel.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/sort_asc.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/grid/sort_desc.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/menu/checked.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/menu/group-checked.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/menu/item-over - Copy.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/menu/item-over.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/menu/menu-parent.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/menu/menu.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/menu/unchecked.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/panel/corners-sprite.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/panel/left-right.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/panel/light-hd.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/panel/tool-sprite-tpl.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/panel/tool-sprites.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/panel/tools-sprites-trans.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/panel/top-bottom.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/panel/top-bottom.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/panel/white-corners-sprite.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/panel/white-left-right.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/panel/white-top-bottom.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/progress/progress-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/qtip/bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/qtip/close.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/qtip/tip-sprite.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/s.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/shared/glass-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/shared/hd-sprite.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/shared/left-btn.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/shared/right-btn.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/sizer/e-handle-dark.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/sizer/e-handle.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/sizer/ne-handle-dark.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/sizer/ne-handle.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/sizer/nw-handle-dark.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/sizer/nw-handle.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/sizer/s-handle-dark.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/sizer/s-handle.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/sizer/se-handle-dark.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/sizer/se-handle.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/sizer/square.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/sizer/sw-handle-dark.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/sizer/sw-handle.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/slider/slider-bg.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/slider/slider-thumb.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/slider/slider-v-bg.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/slider/slider-v-thumb.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/tabs/scroll-left.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/tabs/scroll-right.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/tabs/scroller-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/tabs/tab-btm-inactive-left-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/tabs/tab-btm-inactive-right-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/tabs/tab-btm-left-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/tabs/tab-btm-right-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/tabs/tab-close.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/tabs/tab-strip-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/tabs/tab-strip-bg.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/tabs/tab-strip-btm-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/tabs/tabs-sprite.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/toolbar/bg-menu.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/toolbar/bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/toolbar/btn-arrow-light.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/toolbar/btn-arrow.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/toolbar/btn-over-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/toolbar/gray-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/toolbar/tb-bg.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/toolbar/tb-btn-sprite.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/tree/arrows.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/window/icon-error.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/window/icon-info.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/window/icon-question.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/window/icon-warning.gif +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/window/left-corners.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/window/left-right.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/window/right-corners.png +0 -0
- data/lipsiadmin_generators/backend/templates/images/ext/slate/window/top-bottom.png +0 -0
- data/lipsiadmin_generators/backend/templates/javascripts/controls.js +3 -0
- data/lipsiadmin_generators/backend/templates/javascripts/dragdrop.js +3 -0
- data/lipsiadmin_generators/backend/templates/javascripts/effects.js +4 -0
- data/lipsiadmin_generators/backend/templates/javascripts/ext.js +76 -0
- data/lipsiadmin_generators/backend/templates/javascripts/prototype.js +12 -0
- data/lipsiadmin_generators/backend/templates/layouts/backend.html.haml +12 -0
- data/lipsiadmin_generators/backend/templates/layouts/frontend.html.haml +7 -0
- data/lipsiadmin_generators/backend/templates/migrations/create_accounts.rb +20 -0
- data/lipsiadmin_generators/backend/templates/models/account.rb +116 -0
- data/lipsiadmin_generators/backend/templates/models/account_access.rb +17 -0
- data/lipsiadmin_generators/backend/templates/models/notifier.rb +15 -0
- data/lipsiadmin_generators/backend/templates/stylesheets/backend-slate.css +105 -0
- data/lipsiadmin_generators/backend/templates/stylesheets/backend.css +74 -0
- data/lipsiadmin_generators/backend/templates/stylesheets/ext-slate.css +241 -0
- data/lipsiadmin_generators/backend/templates/stylesheets/ext.css +904 -0
- data/lipsiadmin_generators/backend/templates/stylesheets/login.css +22 -0
- data/lipsiadmin_generators/backend/templates/stylesheets/print.css +11 -0
- data/lipsiadmin_generators/backend/templates/stylesheets/standard.css +62 -0
- data/lipsiadmin_generators/backend/templates/views/backend/accounts/_form.html.haml +21 -0
- data/lipsiadmin_generators/backend/templates/views/backend/accounts/edit.html.haml +3 -0
- data/lipsiadmin_generators/backend/templates/views/backend/accounts/index.rjs +16 -0
- data/lipsiadmin_generators/backend/templates/views/backend/accounts/new.html.haml +3 -0
- data/lipsiadmin_generators/backend/templates/views/backend/base/index.html.haml +17 -0
- data/lipsiadmin_generators/backend/templates/views/backend/base/welcome.html.haml +2 -0
- data/lipsiadmin_generators/backend/templates/views/backend/sessions/new.html.haml +12 -0
- data/lipsiadmin_generators/backend/templates/views/javascripts/backend.js.erb +346 -0
- data/lipsiadmin_generators/backend/templates/views/javascripts/locale.js.erb +135 -0
- data/lipsiadmin_generators/backend/templates/views/notifier/registration.html.erb +2 -0
- data/lipsiadmin_generators/backend/templates/views/notifier/support_request.html.erb +1 -0
- data/lipsiadmin_generators/backend_page/REMEMBER +7 -0
- data/lipsiadmin_generators/backend_page/backend_page_generator.rb +212 -0
- data/lipsiadmin_generators/backend_page/templates/controller.rb +61 -0
- data/lipsiadmin_generators/backend_page/templates/form.html.haml +5 -0
- data/lipsiadmin_generators/backend_page/templates/form_scaffolding.html.haml +1 -0
- data/lipsiadmin_generators/backend_page/templates/functional_test.rb +45 -0
- data/lipsiadmin_generators/backend_page/templates/helper.rb +2 -0
- data/lipsiadmin_generators/backend_page/templates/view_edit.html.haml +3 -0
- data/lipsiadmin_generators/backend_page/templates/view_index.rjs.erb +16 -0
- data/lipsiadmin_generators/backend_page/templates/view_new.html.haml +3 -0
- data/lipsiadmin_generators/pdf/pdf_generator.rb +50 -0
- data/lipsiadmin_generators/pdf/templates/layout.html.erb +18 -0
- data/lipsiadmin_generators/pdf/templates/stylesheets/print.css +11 -0
- data/lipsiadmin_generators/pdf/templates/view.html.haml +7 -0
- data/resources/Pd4Ruby.class +0 -0
- data/resources/Pd4Ruby.java +52 -0
- data/resources/javascripts/ux.js +1102 -0
- data/resources/pd4ml.jar +0 -0
- data/resources/rdoc/horo.rb +613 -0
- data/resources/ss_css2.jar +0 -0
- data/tasks/lipsiadmin_tasks.rake +14 -0
- metadata +604 -0
@@ -0,0 +1,515 @@
|
|
1
|
+
module Lipsiadmin
|
2
|
+
# Attachment allows file attachments that are stored in the filesystem. All graphical
|
3
|
+
# transformations are done using the Graphics/ImageMagick command line utilities and
|
4
|
+
# are stored in Tempfiles until the record is saved. Attachment does not require a
|
5
|
+
# separate model for storing the attachment's information, instead adding a few simple
|
6
|
+
# columns to your table.
|
7
|
+
#
|
8
|
+
# Author:: Jon Yurek
|
9
|
+
# Copyright:: Copyright (c) 2008 thoughtbot, inc.
|
10
|
+
# License:: MIT License (http://www.opensource.org/licenses/mit-license.php)
|
11
|
+
#
|
12
|
+
# Attachment defines an attachment as any file, though it makes special considerations
|
13
|
+
# for image files. You can declare that a model has an attached file with the
|
14
|
+
# +has_one_attachment+ method:
|
15
|
+
#
|
16
|
+
# From your console:
|
17
|
+
# script/generate attachment
|
18
|
+
#
|
19
|
+
# Then in any model you can do:
|
20
|
+
#
|
21
|
+
# class User < ActiveRecord::Base
|
22
|
+
# has_many_attachments :attachments, :dependent => :destroy
|
23
|
+
# has_one_attachment :image
|
24
|
+
# attachment_styles_for :attachments, :normal, "128x128!"
|
25
|
+
# validates_attachment_presence_for :attachments
|
26
|
+
# validates_attachment_size_for :attachments, :greater_than => 10.megabytes
|
27
|
+
# validates_attachment_content_type_for :attachments, "image/png"
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
# See the <tt>Lipsiadmin::DataBase::Attachment::ClassMethods</tt> documentation for more details.
|
31
|
+
module Attachment
|
32
|
+
|
33
|
+
class << self
|
34
|
+
# Provides configurability to Attachment. There are a number of options available, such as:
|
35
|
+
# * whiny_thumbnails: Will raise an error if Attachment cannot process thumbnails of
|
36
|
+
# an uploaded image. Defaults to false.
|
37
|
+
# * log: Logs progress to the Rails log. Uses ActiveRecord's logger, so honors
|
38
|
+
# log levels, etc. Defaults to true.
|
39
|
+
# * command_path: Defines the path at which to find the command line
|
40
|
+
# programs if they are not visible to Rails the system's search path. Defaults to
|
41
|
+
# nil, which uses the first executable found in the user's search path.
|
42
|
+
# * image_magick_path: Deprecated alias of command_path.
|
43
|
+
def options
|
44
|
+
@options ||= {
|
45
|
+
:whiny_thumbnails => false,
|
46
|
+
:image_magick_path => nil,
|
47
|
+
:command_path => nil,
|
48
|
+
:log => true,
|
49
|
+
:swallow_stderr => true
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
53
|
+
def processor(name) #:nodoc:
|
54
|
+
name = name.to_s.camelize
|
55
|
+
processor = Lipsiadmin::Attachment.const_get(name)
|
56
|
+
unless processor.ancestors.include?(Lipsiadmin::Attachment::Processor)
|
57
|
+
raise AttachmentError.new("Processor #{name} was not found")
|
58
|
+
end
|
59
|
+
processor
|
60
|
+
end
|
61
|
+
|
62
|
+
def interpolates(key, &block) #:nodoc:
|
63
|
+
Lipsiadmin::Attachment.interpolations[key] = block
|
64
|
+
end
|
65
|
+
|
66
|
+
# The run method takes a command to execute and a string of parameters
|
67
|
+
# that get passed to it. The command is prefixed with the :command_path
|
68
|
+
# option from Attachment.options. If you have many commands to run and
|
69
|
+
# they are in different paths, the suggested course of action is to
|
70
|
+
# symlink them so they are all in the same directory.
|
71
|
+
#
|
72
|
+
# If the command returns with a result code that is not one of the
|
73
|
+
# expected_outcodes, a AttachmentCommandLineError will be raised. Generally
|
74
|
+
# a code of 0 is expected, but a list of codes may be passed if necessary.
|
75
|
+
def run(cmd, params = "", expected_outcodes = 0)
|
76
|
+
command = %Q<#{%Q[#{path_for_command(cmd)} #{params}].gsub(/\s+/, " ")}>
|
77
|
+
command = "#{command} 2>#{bit_bucket}" if Attachment.options[:swallow_stderr]
|
78
|
+
output = `#{command}`
|
79
|
+
unless [expected_outcodes].flatten.include?($?.exitstatus)
|
80
|
+
raise AttachmentCommandLineError, "Error while running #{cmd}"
|
81
|
+
end
|
82
|
+
output
|
83
|
+
end
|
84
|
+
|
85
|
+
def path_for_command(command)#:nodoc:
|
86
|
+
if options[:image_magick_path]
|
87
|
+
warn("[DEPRECATION] :image_magick_path is deprecated and will be removed. Use :command_path instead")
|
88
|
+
end
|
89
|
+
path = [options[:command_path] || options[:image_magick_path], command].compact
|
90
|
+
File.join(*path)
|
91
|
+
end
|
92
|
+
|
93
|
+
def bit_bucket #:nodoc:
|
94
|
+
File.exists?("/dev/null") ? "/dev/null" : "NUL"
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
class AttachmentError < StandardError #:nodoc:
|
99
|
+
end
|
100
|
+
|
101
|
+
class AttachmentCommandLineError < StandardError #:nodoc:
|
102
|
+
end
|
103
|
+
|
104
|
+
class NotIdentifiedByImageMagickError < AttachmentError #:nodoc:
|
105
|
+
end
|
106
|
+
|
107
|
+
# The Attachment class manages the files for a given attachment. It saves
|
108
|
+
# when the model saves, deletes when the model is destroyed, and processes
|
109
|
+
# the file upon assignment.
|
110
|
+
class Attach
|
111
|
+
|
112
|
+
def self.default_options
|
113
|
+
@default_options ||= {
|
114
|
+
:url => "/uploads/:id_:style_:basename.:extension",
|
115
|
+
:path => ":rails_root/public/uploads/:id_:style_:basename.:extension",
|
116
|
+
:styles => {},
|
117
|
+
:default_url => "/images/backend/no-image.png",
|
118
|
+
:default_style => :normal,
|
119
|
+
:validations => {},
|
120
|
+
:storage => :filesystem
|
121
|
+
}
|
122
|
+
end
|
123
|
+
|
124
|
+
attr_reader :name, :instance, :styles, :default_style, :convert_options, :queued_for_write
|
125
|
+
|
126
|
+
# Creates an Attachment object. +name+ is the name of the attachment,
|
127
|
+
# +instance+ is the ActiveRecord object instance it's attached to, and
|
128
|
+
# +options+ is the same as the hash passed to +has_attached_file+.
|
129
|
+
def initialize(name, instance, options = {})
|
130
|
+
@name = name
|
131
|
+
@instance = instance
|
132
|
+
|
133
|
+
options = self.class.default_options.merge(options)
|
134
|
+
|
135
|
+
@url = options[:url]
|
136
|
+
@path = options[:path]
|
137
|
+
@styles = options[:styles]
|
138
|
+
@default_url = options[:default_url]
|
139
|
+
@validations = options[:validations]
|
140
|
+
@default_style = options[:default_style]
|
141
|
+
@storage = options[:storage]
|
142
|
+
@whiny = options[:whiny_thumbnails]
|
143
|
+
@convert_options = options[:convert_options] || {}
|
144
|
+
@background = options[:background].nil? ? instance.respond_to?(:spawn) : options[:background]
|
145
|
+
@processors = options[:processors] || [:thumbnail]
|
146
|
+
@options = options
|
147
|
+
@queued_for_delete = []
|
148
|
+
@queued_for_write = {}
|
149
|
+
@errors = {}
|
150
|
+
@validation_errors = nil
|
151
|
+
@dirty = false
|
152
|
+
|
153
|
+
normalize_style_definition
|
154
|
+
initialize_storage
|
155
|
+
|
156
|
+
log("Attachment on #{instance.class} initialized.")
|
157
|
+
end
|
158
|
+
|
159
|
+
# What gets called when you call instance.attachment = File. It clears
|
160
|
+
# errors, assigns attributes, processes the file, and runs validations. It
|
161
|
+
# also queues up the previous file for deletion, to be flushed away on
|
162
|
+
# #save of its host. In addition to form uploads, you can also assign
|
163
|
+
# another Attachment attachment:
|
164
|
+
# new_user.avatar = old_user.avatar
|
165
|
+
# If the file that is assigned is not valid, the processing (i.e.
|
166
|
+
# thumbnailing, etc) will NOT be run.
|
167
|
+
def assign(uploaded_file)
|
168
|
+
%w(file_name).each do |field|
|
169
|
+
unless @instance.class.column_names.include?("#{name}_#{field}")
|
170
|
+
raise AttachmentError.new("#{@instance.class} model does not have required column '#{name}_#{field}'")
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
if uploaded_file.is_a?(Lipsiadmin::Attachment::Attach)
|
175
|
+
uploaded_file = uploaded_file.to_file(:original)
|
176
|
+
close_uploaded_file = uploaded_file.respond_to?(:close)
|
177
|
+
end
|
178
|
+
|
179
|
+
return nil unless valid_assignment?(uploaded_file)
|
180
|
+
log("Assigning #{uploaded_file.inspect} to #{name}")
|
181
|
+
|
182
|
+
uploaded_file.binmode if uploaded_file.respond_to? :binmode
|
183
|
+
queue_existing_for_delete
|
184
|
+
@errors = {}
|
185
|
+
@validation_errors = nil
|
186
|
+
|
187
|
+
return nil if uploaded_file.nil?
|
188
|
+
|
189
|
+
log("Writing attributes for #{name}")
|
190
|
+
@queued_for_write[:original] = uploaded_file.to_tempfile
|
191
|
+
instance_write(:file_name, uploaded_file.original_filename.strip.gsub(/[^\w\d\.\-]+/, '_'))
|
192
|
+
instance_write(:content_type, uploaded_file.content_type.to_s.strip)
|
193
|
+
instance_write(:file_size, uploaded_file.size.to_i)
|
194
|
+
instance_write(:updated_at, Time.now)
|
195
|
+
|
196
|
+
@dirty = true
|
197
|
+
|
198
|
+
solidify_style_definitions
|
199
|
+
post_process if valid?
|
200
|
+
|
201
|
+
# Reset the file size if the original file was reprocessed.
|
202
|
+
instance_write(:file_size, @queued_for_write[:original].size.to_i)
|
203
|
+
ensure
|
204
|
+
uploaded_file.close if close_uploaded_file
|
205
|
+
validate
|
206
|
+
end
|
207
|
+
|
208
|
+
# Returns the public URL of the attachment, with a given style. Note that
|
209
|
+
# this does not necessarily need to point to a file that your web server
|
210
|
+
# can access and can point to an action in your app, if you need fine
|
211
|
+
# grained security. This is not recommended if you don't need the
|
212
|
+
# security, however, for performance reasons. set
|
213
|
+
# include_updated_timestamp to false if you want to stop the attachment
|
214
|
+
# update time appended to the url
|
215
|
+
def url(style = default_style, include_updated_timestamp = true)
|
216
|
+
if original_filename.nil?
|
217
|
+
url = interpolate(@default_url, style)
|
218
|
+
elsif File.exist?(path(style))
|
219
|
+
url = interpolate(@url, style)
|
220
|
+
else
|
221
|
+
url = interpolate(@url, :original)
|
222
|
+
end
|
223
|
+
include_updated_timestamp && updated_at ? [url, updated_at].compact.join(url.include?("?") ? "&" : "?") : url
|
224
|
+
end
|
225
|
+
|
226
|
+
# Returns the path of the attachment as defined by the :path option. If the
|
227
|
+
# file is stored in the filesystem the path refers to the path of the file
|
228
|
+
# on disk. If the file is stored in S3, the path is the "key" part of the
|
229
|
+
# URL, and the :bucket option refers to the S3 bucket.
|
230
|
+
def path(style = nil) #:nodoc:
|
231
|
+
original_filename.nil? ? nil : interpolate(@path, style)
|
232
|
+
end
|
233
|
+
|
234
|
+
# Alias to +url+
|
235
|
+
def to_s(style = nil)
|
236
|
+
url(style)
|
237
|
+
end
|
238
|
+
|
239
|
+
# Returns true if there are no errors on this attachment.
|
240
|
+
def valid?
|
241
|
+
validate
|
242
|
+
errors.empty?
|
243
|
+
end
|
244
|
+
|
245
|
+
# Returns an array containing the errors on this attachment.
|
246
|
+
def errors
|
247
|
+
@errors
|
248
|
+
end
|
249
|
+
|
250
|
+
# Returns true if there are changes that need to be saved.
|
251
|
+
def dirty?
|
252
|
+
@dirty
|
253
|
+
end
|
254
|
+
|
255
|
+
# Saves the file, if there are no errors. If there are, it flushes them to
|
256
|
+
# the instance's errors and returns false, cancelling the save.
|
257
|
+
def save
|
258
|
+
if valid?
|
259
|
+
log("Saving files for #{name}")
|
260
|
+
flush_deletes
|
261
|
+
flush_writes
|
262
|
+
@dirty = false
|
263
|
+
true
|
264
|
+
else
|
265
|
+
log("Errors on #{name}. Not saving.")
|
266
|
+
flush_errors
|
267
|
+
false
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
# Returns the name of the file as originally assigned, and lives in the
|
272
|
+
# <attachment>_file_name attribute of the model.
|
273
|
+
def original_filename
|
274
|
+
instance_read(:file_name)
|
275
|
+
end
|
276
|
+
|
277
|
+
# Returns the size of the file as originally assigned, and lives in the
|
278
|
+
# <attachment>_file_size attribute of the model.
|
279
|
+
def size
|
280
|
+
instance_read(:file_size) || (@queued_for_write[:original] && @queued_for_write[:original].size)
|
281
|
+
end
|
282
|
+
|
283
|
+
# Returns the content_type of the file as originally assigned, and lives
|
284
|
+
# in the <attachment>_content_type attribute of the model.
|
285
|
+
def content_type
|
286
|
+
instance_read(:content_type)
|
287
|
+
end
|
288
|
+
|
289
|
+
# Returns the last modified time of the file as originally assigned, and
|
290
|
+
# lives in the <attachment>_updated_at attribute of the model.
|
291
|
+
def updated_at
|
292
|
+
time = instance_read(:updated_at)
|
293
|
+
time && time.to_i
|
294
|
+
end
|
295
|
+
|
296
|
+
# A hash of procs that are run during the interpolation of a path or url.
|
297
|
+
# A variable of the format :name will be replaced with the return value of
|
298
|
+
# the proc named ":name". Each lambda takes the attachment and the current
|
299
|
+
# style as arguments. This hash can be added to with your own proc if
|
300
|
+
# necessary.
|
301
|
+
def self.interpolations
|
302
|
+
@interpolations ||= {
|
303
|
+
:rails_root => lambda{|attachment,style| RAILS_ROOT },
|
304
|
+
:rails_env => lambda{|attachment,style| RAILS_ENV },
|
305
|
+
:class => lambda do |attachment,style|
|
306
|
+
attachment.instance.class.name.underscore.pluralize
|
307
|
+
end,
|
308
|
+
:basename => lambda do |attachment,style|
|
309
|
+
attachment.original_filename.gsub(/#{File.extname(attachment.original_filename)}$/, "")
|
310
|
+
end,
|
311
|
+
:extension => lambda do |attachment,style|
|
312
|
+
((style = attachment.styles[style]) && style[:format]) ||
|
313
|
+
File.extname(attachment.original_filename).gsub(/^\.+/, "")
|
314
|
+
end,
|
315
|
+
:id => lambda{|attachment,style| attachment.instance.id },
|
316
|
+
:id_partition => lambda do |attachment, style|
|
317
|
+
("%09d" % attachment.instance.id).scan(/\d{3}/).join("/")
|
318
|
+
end,
|
319
|
+
:attachment => lambda{|attachment,style| attachment.name.to_s.downcase.pluralize },
|
320
|
+
:style => lambda{|attachment,style| style || attachment.default_style },
|
321
|
+
}
|
322
|
+
end
|
323
|
+
|
324
|
+
# This method really shouldn't be called that often. It's expected use is
|
325
|
+
# in the attachment:refresh rake task and that's it. It will regenerate all
|
326
|
+
# thumbnails forcefully, by reobtaining the original file and going through
|
327
|
+
# the post-process again.
|
328
|
+
def reprocess!
|
329
|
+
new_original = Tempfile.new("attachment-reprocess")
|
330
|
+
new_original.binmode
|
331
|
+
if old_original = to_file(:original)
|
332
|
+
new_original.write( old_original.read )
|
333
|
+
new_original.rewind
|
334
|
+
|
335
|
+
@queued_for_write = { :original => new_original }
|
336
|
+
post_process
|
337
|
+
|
338
|
+
old_original.close if old_original.respond_to?(:close)
|
339
|
+
|
340
|
+
save
|
341
|
+
else
|
342
|
+
true
|
343
|
+
end
|
344
|
+
end
|
345
|
+
|
346
|
+
# Returns true if a file has been assigned.
|
347
|
+
def exist?
|
348
|
+
!original_filename.blank?
|
349
|
+
end
|
350
|
+
|
351
|
+
# Writes the attachment-specific attribute on the instance. For example,
|
352
|
+
# instance_write(:file_name, "me.jpg") will write "me.jpg" to the instance's
|
353
|
+
# "avatar_file_name" field (assuming the attachment is called avatar).
|
354
|
+
def instance_write(attr, value)
|
355
|
+
setter = :"#{name}_#{attr}="
|
356
|
+
responds = instance.respond_to?(setter)
|
357
|
+
instance.send(setter, value) if responds || attr.to_s == "file_name"
|
358
|
+
end
|
359
|
+
|
360
|
+
# Reads the attachment-specific attribute on the instance. See instance_write
|
361
|
+
# for more details.
|
362
|
+
def instance_read(attr)
|
363
|
+
getter = :"#{name}_#{attr}"
|
364
|
+
responds = instance.respond_to?(getter)
|
365
|
+
instance.send(getter) if responds || attr.to_s == "file_name"
|
366
|
+
end
|
367
|
+
|
368
|
+
def logger #:nodoc:
|
369
|
+
instance.logger
|
370
|
+
end
|
371
|
+
|
372
|
+
def log message #:nodoc:
|
373
|
+
logger.info("[Attachment] #{message}") if logging?
|
374
|
+
end
|
375
|
+
|
376
|
+
def logging? #:nodoc:
|
377
|
+
Lipsiadmin::Attachment.options[:log]
|
378
|
+
end
|
379
|
+
|
380
|
+
def valid_assignment? file #:nodoc:
|
381
|
+
file.nil? || (file.respond_to?(:original_filename) && file.respond_to?(:content_type))
|
382
|
+
end
|
383
|
+
|
384
|
+
def validate #:nodoc:
|
385
|
+
unless @validation_errors
|
386
|
+
@validation_errors = @validations.inject({}) do |errors, validation|
|
387
|
+
name, block = validation
|
388
|
+
errors[name] = block.call(self, instance) if block
|
389
|
+
errors
|
390
|
+
end
|
391
|
+
@validation_errors.reject!{|k,v| v == nil }
|
392
|
+
@errors.merge!(@validation_errors)
|
393
|
+
end
|
394
|
+
@validation_errors
|
395
|
+
end
|
396
|
+
|
397
|
+
def normalize_style_definition #:nodoc:
|
398
|
+
@styles.each do |name, args|
|
399
|
+
unless args.is_a? Hash
|
400
|
+
dimensions, format = [args, nil].flatten[0..1]
|
401
|
+
format = nil if format.blank?
|
402
|
+
@styles[name] = {
|
403
|
+
:processors => @processors,
|
404
|
+
:geometry => dimensions,
|
405
|
+
:format => format,
|
406
|
+
:whiny => @whiny,
|
407
|
+
:convert_options => extra_options_for(name)
|
408
|
+
}
|
409
|
+
else
|
410
|
+
@styles[name] = {
|
411
|
+
:processors => @processors,
|
412
|
+
:whiny => @whiny,
|
413
|
+
:convert_options => extra_options_for(name)
|
414
|
+
}.merge(@styles[name])
|
415
|
+
end
|
416
|
+
end
|
417
|
+
end
|
418
|
+
|
419
|
+
def solidify_style_definitions #:nodoc:
|
420
|
+
@styles.each do |name, args|
|
421
|
+
if @styles[name][:geometry].respond_to?(:call)
|
422
|
+
@styles[name][:geometry] = @styles[name][:geometry].call(instance)
|
423
|
+
end
|
424
|
+
end
|
425
|
+
end
|
426
|
+
|
427
|
+
def initialize_storage #:nodoc:
|
428
|
+
@storage_module = Attachment::Storage.const_get(@storage.to_s.capitalize)
|
429
|
+
self.extend(@storage_module)
|
430
|
+
end
|
431
|
+
|
432
|
+
def extra_options_for(style) #:nodoc:
|
433
|
+
all_options = convert_options[:all]
|
434
|
+
all_options = all_options.call(instance) if all_options.respond_to?(:call)
|
435
|
+
style_options = convert_options[style]
|
436
|
+
style_options = style_options.call(instance) if style_options.respond_to?(:call)
|
437
|
+
|
438
|
+
[ style_options, all_options ].compact.join(" ")
|
439
|
+
end
|
440
|
+
|
441
|
+
def post_process #:nodoc:
|
442
|
+
return if @queued_for_write[:original].nil?
|
443
|
+
background do
|
444
|
+
return if fire_events(:before)
|
445
|
+
post_process_styles
|
446
|
+
return if fire_events(:after)
|
447
|
+
end
|
448
|
+
end
|
449
|
+
|
450
|
+
def fire_events(which) #:nodoc:
|
451
|
+
return true if callback(:"#{which}_post_process") == false
|
452
|
+
return true if callback(:"#{which}_#{name}_post_process") == false
|
453
|
+
end
|
454
|
+
|
455
|
+
def post_process_styles #:nodoc:
|
456
|
+
log("Post-processing #{name}")
|
457
|
+
@styles.each do |name, args|
|
458
|
+
begin
|
459
|
+
raise RuntimeError.new("Style #{name} has no processors defined.") if args[:processors].blank?
|
460
|
+
@queued_for_write[name] = args[:processors].inject(@queued_for_write[:original]) do |file, processor|
|
461
|
+
log("Processing #{name} #{file} in the #{processor} processor.")
|
462
|
+
Lipsiadmin::Attachment.processor(processor).make(file, args)
|
463
|
+
end
|
464
|
+
rescue AttachmentError => e
|
465
|
+
log("An error was received while processing: #{e.inspect}")
|
466
|
+
(@errors[:processing] ||= []) << e.message if @whiny
|
467
|
+
end
|
468
|
+
end
|
469
|
+
end
|
470
|
+
|
471
|
+
# When processing, if the spawn plugin is installed, processing can be done in
|
472
|
+
# a background fork or thread if desired.
|
473
|
+
def background(&blk)
|
474
|
+
# if instance.respond_to?(:spawn) && @background
|
475
|
+
# instance.spawn(&blk)
|
476
|
+
# else
|
477
|
+
blk.call
|
478
|
+
# end
|
479
|
+
end
|
480
|
+
|
481
|
+
def callback(which)#:nodoc:
|
482
|
+
instance.run_callbacks(which, @queued_for_write){|result, obj| result == false }
|
483
|
+
end
|
484
|
+
|
485
|
+
def interpolate(pattern, style = default_style) #:nodoc:
|
486
|
+
interpolations = self.class.interpolations.sort{|a,b| a.first.to_s <=> b.first.to_s }
|
487
|
+
interpolations.reverse.inject( pattern.dup ) do |result, interpolation|
|
488
|
+
tag, blk = interpolation
|
489
|
+
result.gsub(/:#{tag}/) do |match|
|
490
|
+
blk.call( self, style )
|
491
|
+
end
|
492
|
+
end
|
493
|
+
end
|
494
|
+
|
495
|
+
def queue_existing_for_delete #:nodoc:
|
496
|
+
return unless exist?
|
497
|
+
log("Queueing the existing files for #{name} for deletion.")
|
498
|
+
@queued_for_delete += [:original, *@styles.keys].uniq.map do |style|
|
499
|
+
path(style) if exists?(style)
|
500
|
+
end.compact
|
501
|
+
instance_write(:file_name, nil)
|
502
|
+
instance_write(:content_type, nil)
|
503
|
+
instance_write(:file_size, nil)
|
504
|
+
instance_write(:updated_at, nil)
|
505
|
+
end
|
506
|
+
|
507
|
+
def flush_errors #:nodoc:
|
508
|
+
@errors.each do |error, message|
|
509
|
+
instance.errors.add(name, message) if message
|
510
|
+
end
|
511
|
+
end
|
512
|
+
|
513
|
+
end
|
514
|
+
end
|
515
|
+
end
|