tb_core 1.1.10 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +6 -14
- data/README.md +50 -2
- data/app/assets/javascripts/admin/core/application.js +2 -2
- data/app/assets/javascripts/admin/core/editor.js +1 -0
- data/app/assets/javascripts/admin/core/preinit.js +1 -1
- data/app/assets/javascripts/admin/core/split_pane.js +4 -0
- data/app/assets/javascripts/admin/core/users.js +59 -12
- data/app/assets/libs/bootstrap/css/{bootstrap.css → bootstrap.css.scss} +11 -11
- data/app/assets/libs/{tiny_mce → tinymce}/plugins/tableDropdown/editor_plugin.js +0 -0
- data/app/controllers/admin/application_controller.rb +0 -1
- data/app/controllers/admin/roles_controller.rb +10 -4
- data/app/controllers/admin/settings_controller.rb +10 -2
- data/app/controllers/admin/setup_controller.rb +7 -1
- data/app/controllers/admin/users_controller.rb +8 -2
- data/app/controllers/sitemaps_controller.rb +0 -1
- data/app/controllers/spud/application_controller.rb +9 -2
- data/app/helpers/spud/application_helper.rb +21 -0
- data/app/models/spud/spud_user_model.rb +79 -0
- data/app/models/spud_role.rb +0 -1
- data/app/models/spud_role_permission.rb +0 -1
- data/app/models/spud_user.rb +2 -80
- data/app/views/admin/roles/index.html.erb +4 -2
- data/app/views/admin/users/_form.html.erb +3 -0
- data/app/views/admin/users/_form_additions.html.erb +1 -0
- data/app/views/admin/users/_show_additions.html.erb +1 -0
- data/app/views/admin/users/show.html.erb +1 -0
- data/config/routes.rb +3 -3
- data/lib/generators/spud/module_generator.rb +5 -1
- data/lib/generators/spud/templates/admin_controller.rb.erb +6 -2
- data/lib/generators/spud/templates/views/admin/index.html.erb +5 -7
- data/lib/spud_core/engine.rb +2 -24
- data/lib/spud_core/version.rb +1 -1
- data/spec/controllers/admin/settings_controller_spec.rb +2 -2
- data/spec/controllers/sitemap_controllers_spec.rb +4 -3
- data/spec/dummy/config/application.rb +1 -0
- data/spec/dummy/config/environments/test.rb +9 -2
- data/spec/dummy/config/initializers/secret_token.rb +1 -0
- data/spec/dummy/log/test.log +12429 -0
- data/spec/dummy/tmp/cache/assets/test/sass/05388b0d18737541b44c9082e3fa19afa6bf3826/application.css.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/test/sass/05388b0d18737541b44c9082e3fa19afa6bf3826/login.css.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/test/sass/05388b0d18737541b44c9082e3fa19afa6bf3826/split_pane.css.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/test/sass/05388b0d18737541b44c9082e3fa19afa6bf3826/users.css.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/test/sass/e99c58815a3ff18987eada90ba5c7e95383074f2/bootstrap.css.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/0075c6e170e8012f220c7ed9fb5dc88b +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/01666d6af504317dcf63364a37ce60f4 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/03dcdc877f0257624872c73967d201c6 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/06d52af2fa483161bb27dd39c3b34ee3 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/098869073bd11dbc41fcaa47716a0ce7 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/0cabf8a5146f359edd424e4f820e07f1 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/0f971f36ba87298fbaf46154fa8a5d30 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/13809885160329b0a1a4e7885fb75ca4 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/16243b3ad44c2997ad70996b58c56a2a +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/169b221054fadd95f44252a232a5f053 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/1816341e15110810c4647824cc81d1aa +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/18d440ef7bcf78056d346ac1ff2a6793 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/1c06ad369cba88ec3ff5afc06e982d7c +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/1fa18bd231ff77b2af93913518487967 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/21e6a044a925c5f44f5a9d9b9e2d164a +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/2393e42173c512eb5171116ee479ab7e +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/2b94b5653a1151795fb999b3e98fd1d8 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/2fe2bffc50d1c3cd5c0a896a5528e23b +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/3024a96b82ffd6a5f68295a953231c92 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/3123e8917685babc03cb0c8aeccac695 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/353180d0c9fd2a3ccef3718d7e6ace6c +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/37539a535fefc75cd61aa9438d821846 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/38eabf5ce9c4dda42d09332aee816d3e +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/39efa102c753ebe9defd90062785a8aa +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/3cc30d9fb936455c063d7a950c46bb32 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/4546971591261f8a01d0837f5a31af35 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/45b53d5ab2cac60703cd9d2cf52c14eb +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/49d27d2d81616b48039efe15075da4f2 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/4a689e727abc31a4f93798253a176295 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/55d4fc42707dc9a3400faf92bed0360a +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/5759e8cff07b97209ca7ea6a93b3ed1a +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/5c4e1741d24424c6947eaff78829d41f +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/5cdaff8b68930bd29868b3d0fcb33766 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/5de67e95811f3524bac96ba237505ae6 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/5fe538b2e33228dd92d36cfce50cf4b7 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/6671fad14ea054e577e2dfbcd98e571c +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/6d7103090b0047c9b8d5746d75e8fac9 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/705426de92785d4afa88b06757d25f7d +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/71e715ef316e725981280e9bfe9d0527 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/7391889bc52e8664fd5d590d58a7ec8f +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/7828cb89eaa43959329e301a04ef10a6 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/80dda53c03df39ae9ed8c2400f05990a +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/8121614a686088a7f27165baf5d63da3 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/85af4404353b8373764b166027ce78a4 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/85cdc3810a743722e618b949199320ec +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/88099ac9106f32ee56c2cdde301f4aeb +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/89fbb1e40182037e0eec01e0d3bab067 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/8bb56cbae5a8a5b5f1cf04183a746966 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/8fb7066c091dc8956fadaa0c316fb808 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/9214ad2c4fc7c0298ec351e00379a706 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/9313c3ae5de2dc96635bfa4e6957a149 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/940374cda01486d892775b6f65986599 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/966f020d24b19c1d685c51c240d1923a +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/a444109f6d82fec9d3e8224e0508abc9 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/a4adceeb24e0e96b3cd701b06c7b53d2 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/a4c8d8c64ed3eca5b07e3c1478b00a81 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/a7305f76eab9ded7ce734cea8967a8ee +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/aa893fde36bb6d9e2184bba8385ce160 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/b26e8bc7c7c32058397f892cd9d046d8 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/b8d4b4de990b07fda478ecb232a3b76f +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/ba173160d353bfb6e1f0f284bac8b9de +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/bc750b216ba26d779bcf79fac037b36b +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/bef9d4af2f246671b5c9d21c40b49545 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/c0eaf65fe0db1674c49ba2ae6cccb410 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/c4fa3869fe96ebf26a17b08d5b45d5fb +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/c666b756412f64241236e1112b2e403d +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/c7301f1b1c7ee199b8b8487f43ce78c8 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/cb96d7509d3c2b2f16d6d3a1eaac2b79 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/d02977fa67cf6643e31bb4c063a6d205 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/d5b4ee9436615cb36bb22b9ba87791cf +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/daec02064da70ae5def8a75a5c36e58d +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/dd32919d4bcd591d7aa6937ba4b39ddb +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/e12ec2fd151046a8235cb53a379b3151 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/e232a62130dade197fcabdd428cf737c +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/e7d7a71fa09119e96e640cba43763911 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/f165c137fabbacd60c1bc9fbb6878ae9 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/f365efd4df73b42e492cd479032636ca +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/f81f473be9c249d9ff823b35ba6c7130 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/fda81067bc547bd67ac35e1bc4a7c167 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/fde0dc66d618f90500842b827a11d83b +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/fe35aa99166bfe64fdab2f5f5373a80d +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/ff91e57c48a0748be0394a67cd555438 +0 -0
- metadata +240 -182
- data/app/assets/libs/tiny_mce/jquery.tinymce.js +0 -1
- data/app/assets/libs/tiny_mce/langs/en.js +0 -1
- data/app/assets/libs/tiny_mce/license.txt +0 -504
- data/app/assets/libs/tiny_mce/plugins/advhr/css/advhr.css +0 -5
- data/app/assets/libs/tiny_mce/plugins/advhr/editor_plugin.js +0 -1
- data/app/assets/libs/tiny_mce/plugins/advhr/editor_plugin_src.js +0 -57
- data/app/assets/libs/tiny_mce/plugins/advhr/js/rule.js +0 -43
- data/app/assets/libs/tiny_mce/plugins/advhr/langs/en_dlg.js +0 -1
- data/app/assets/libs/tiny_mce/plugins/advhr/rule.htm +0 -58
- data/app/assets/libs/tiny_mce/plugins/advimage/css/advimage.css +0 -13
- data/app/assets/libs/tiny_mce/plugins/advimage/editor_plugin.js +0 -1
- data/app/assets/libs/tiny_mce/plugins/advimage/editor_plugin_src.js +0 -50
- data/app/assets/libs/tiny_mce/plugins/advimage/image.htm +0 -235
- data/app/assets/libs/tiny_mce/plugins/advimage/img/sample.gif +0 -0
- data/app/assets/libs/tiny_mce/plugins/advimage/js/image.js +0 -462
- data/app/assets/libs/tiny_mce/plugins/advimage/langs/en_dlg.js +0 -1
- data/app/assets/libs/tiny_mce/plugins/advlink/css/advlink.css +0 -8
- data/app/assets/libs/tiny_mce/plugins/advlink/editor_plugin.js +0 -1
- data/app/assets/libs/tiny_mce/plugins/advlink/editor_plugin_src.js +0 -61
- data/app/assets/libs/tiny_mce/plugins/advlink/js/advlink.js +0 -539
- data/app/assets/libs/tiny_mce/plugins/advlink/langs/en_dlg.js +0 -1
- data/app/assets/libs/tiny_mce/plugins/advlink/link.htm +0 -338
- data/app/assets/libs/tiny_mce/plugins/autolink/editor_plugin.js +0 -1
- data/app/assets/libs/tiny_mce/plugins/autolink/editor_plugin_src.js +0 -174
- data/app/assets/libs/tiny_mce/plugins/inlinepopups/editor_plugin.js +0 -1
- data/app/assets/libs/tiny_mce/plugins/inlinepopups/editor_plugin_src.js +0 -699
- data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif +0 -0
- data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif +0 -0
- data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif +0 -0
- data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif +0 -0
- data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif +0 -0
- data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif +0 -0
- data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif +0 -0
- data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css +0 -90
- data/app/assets/libs/tiny_mce/plugins/inlinepopups/template.htm +0 -387
- data/app/assets/libs/tiny_mce/plugins/lists/editor_plugin.js +0 -1
- data/app/assets/libs/tiny_mce/plugins/lists/editor_plugin_src.js +0 -951
- data/app/assets/libs/tiny_mce/plugins/media/css/media.css +0 -17
- data/app/assets/libs/tiny_mce/plugins/media/editor_plugin.js +0 -1
- data/app/assets/libs/tiny_mce/plugins/media/editor_plugin_src.js +0 -890
- data/app/assets/libs/tiny_mce/plugins/media/js/embed.js +0 -73
- data/app/assets/libs/tiny_mce/plugins/media/js/media.js +0 -470
- data/app/assets/libs/tiny_mce/plugins/media/langs/en_dlg.js +0 -1
- data/app/assets/libs/tiny_mce/plugins/media/media.htm +0 -922
- data/app/assets/libs/tiny_mce/plugins/media/moxieplayer.swf +0 -0
- data/app/assets/libs/tiny_mce/plugins/paste/editor_plugin.js +0 -1
- data/app/assets/libs/tiny_mce/plugins/paste/editor_plugin_src.js +0 -871
- data/app/assets/libs/tiny_mce/plugins/paste/js/pastetext.js +0 -36
- data/app/assets/libs/tiny_mce/plugins/paste/js/pasteword.js +0 -51
- data/app/assets/libs/tiny_mce/plugins/paste/langs/en_dlg.js +0 -1
- data/app/assets/libs/tiny_mce/plugins/paste/pastetext.htm +0 -27
- data/app/assets/libs/tiny_mce/plugins/paste/pasteword.htm +0 -21
- data/app/assets/libs/tiny_mce/plugins/table/cell.htm +0 -180
- data/app/assets/libs/tiny_mce/plugins/table/css/cell.css +0 -17
- data/app/assets/libs/tiny_mce/plugins/table/css/row.css +0 -25
- data/app/assets/libs/tiny_mce/plugins/table/css/table.css +0 -13
- data/app/assets/libs/tiny_mce/plugins/table/editor_plugin.js +0 -1
- data/app/assets/libs/tiny_mce/plugins/table/editor_plugin_src.js +0 -1428
- data/app/assets/libs/tiny_mce/plugins/table/js/cell.js +0 -319
- data/app/assets/libs/tiny_mce/plugins/table/js/merge_cells.js +0 -27
- data/app/assets/libs/tiny_mce/plugins/table/js/row.js +0 -237
- data/app/assets/libs/tiny_mce/plugins/table/js/table.js +0 -489
- data/app/assets/libs/tiny_mce/plugins/table/langs/en_dlg.js +0 -1
- data/app/assets/libs/tiny_mce/plugins/table/merge_cells.htm +0 -32
- data/app/assets/libs/tiny_mce/plugins/table/row.htm +0 -158
- data/app/assets/libs/tiny_mce/plugins/table/table.htm +0 -188
- data/app/assets/libs/tiny_mce/themes/advanced/about.htm +0 -52
- data/app/assets/libs/tiny_mce/themes/advanced/anchor.htm +0 -26
- data/app/assets/libs/tiny_mce/themes/advanced/charmap.htm +0 -55
- data/app/assets/libs/tiny_mce/themes/advanced/color_picker.htm +0 -70
- data/app/assets/libs/tiny_mce/themes/advanced/editor_template.js +0 -1
- data/app/assets/libs/tiny_mce/themes/advanced/editor_template_src.js +0 -1467
- data/app/assets/libs/tiny_mce/themes/advanced/image.htm +0 -80
- data/app/assets/libs/tiny_mce/themes/advanced/img/colorpicker.jpg +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/img/flash.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/img/icons.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/img/iframe.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/img/pagebreak.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/img/quicktime.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/img/realmedia.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/img/shockwave.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/img/trans.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/img/video.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/img/windowsmedia.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/js/about.js +0 -73
- data/app/assets/libs/tiny_mce/themes/advanced/js/anchor.js +0 -44
- data/app/assets/libs/tiny_mce/themes/advanced/js/charmap.js +0 -363
- data/app/assets/libs/tiny_mce/themes/advanced/js/color_picker.js +0 -345
- data/app/assets/libs/tiny_mce/themes/advanced/js/image.js +0 -251
- data/app/assets/libs/tiny_mce/themes/advanced/js/link.js +0 -153
- data/app/assets/libs/tiny_mce/themes/advanced/js/source_editor.js +0 -78
- data/app/assets/libs/tiny_mce/themes/advanced/langs/en.js +0 -1
- data/app/assets/libs/tiny_mce/themes/advanced/langs/en_dlg.js +0 -1
- data/app/assets/libs/tiny_mce/themes/advanced/link.htm +0 -57
- data/app/assets/libs/tiny_mce/themes/advanced/shortcuts.htm +0 -47
- data/app/assets/libs/tiny_mce/themes/advanced/skins/default/content.css +0 -51
- data/app/assets/libs/tiny_mce/themes/advanced/skins/default/dialog.css +0 -118
- data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/buttons.png +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/items.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/menu_check.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/progress.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/tabs.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/default/ui.css +0 -215
- data/app/assets/libs/tiny_mce/themes/advanced/skins/highcontrast/content.css +0 -25
- data/app/assets/libs/tiny_mce/themes/advanced/skins/highcontrast/dialog.css +0 -106
- data/app/assets/libs/tiny_mce/themes/advanced/skins/highcontrast/ui.css +0 -102
- data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/content.css +0 -49
- data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/dialog.css +0 -118
- data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png +0 -0
- data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/ui.css +0 -218
- data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +0 -8
- data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +0 -5
- data/app/assets/libs/tiny_mce/themes/advanced/source_editor.htm +0 -25
- data/app/assets/libs/tiny_mce/themes/simple/editor_template.js +0 -1
- data/app/assets/libs/tiny_mce/themes/simple/editor_template_src.js +0 -84
- data/app/assets/libs/tiny_mce/themes/simple/img/icons.gif +0 -0
- data/app/assets/libs/tiny_mce/themes/simple/langs/en.js +0 -1
- data/app/assets/libs/tiny_mce/themes/simple/skins/default/content.css +0 -25
- data/app/assets/libs/tiny_mce/themes/simple/skins/default/ui.css +0 -32
- data/app/assets/libs/tiny_mce/themes/simple/skins/o2k7/content.css +0 -17
- data/app/assets/libs/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png +0 -0
- data/app/assets/libs/tiny_mce/themes/simple/skins/o2k7/ui.css +0 -35
- data/app/assets/libs/tiny_mce/tiny_mce.js +0 -1
- data/app/assets/libs/tiny_mce/tiny_mce_popup.js +0 -5
- data/app/assets/libs/tiny_mce/tiny_mce_src.js +0 -16753
- data/app/assets/libs/tiny_mce/utils/editable_selects.js +0 -70
- data/app/assets/libs/tiny_mce/utils/form_utils.js +0 -210
- data/app/assets/libs/tiny_mce/utils/mctabs.js +0 -162
- data/app/assets/libs/tiny_mce/utils/validate.js +0 -252
- data/app/models/concerns/spud_authentication.rb +0 -10
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
YjZjZTJjYzMyYWI0ZDU3NjViYzYwOTU0Mjk3MDQxNmMyMGY5NWJkYTU3YjVi
|
10
|
-
NTNhYzgwNTJiNDhiNmYwNDEzYjYyZTQxNDRmMDlhMTkyNzUzZGM2OTk5YTgx
|
11
|
-
NDExNzg0NDRlMDM2MzI4OGY2MjU0YzBkNzVhMmNmMGEwNDhjNDM=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
NDg0MzgyNzllZjEwZTIzMTdmYjk2OTcwOGM2MGM2OWUxZDVhMDU0M2EzYzFh
|
14
|
-
MmJiMTk0NGQ2YmViOWM1Yzk0YTRjY2RkZDIxZGVjYTQ4YWY5MTMwYmQxY2M4
|
15
|
-
MTk0MDg1NzIzMTI0ZjZmM2ZlOGI5NzI1NzZhYzUzN2VkZTUyNTE=
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 82e2cb963cff65ecfe9bce4a017ef9e7db5d8078
|
4
|
+
data.tar.gz: 366d9efb54c2822b29f656ba96b69786695e41a1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 39d98a5216017a2cd7c338ca3a462032e917b2776212792c1afe6e0fa196df88963c065264b519189156c3002000a3b880afd2532e3095ec0228b3c90017b483
|
7
|
+
data.tar.gz: 7cbf045bb40e1abb89c5d1bd8b0d171d0688282e61173890f3952d43f614a56dec3c2421234d4b28fb8c5df81c98b66bbe5d246baade90ec06338d40d351fb13
|
data/README.md
CHANGED
@@ -1,13 +1,21 @@
|
|
1
1
|
Twice Baked Core
|
2
2
|
================
|
3
3
|
|
4
|
-
TB Core is the base Twice Baked engine that provides user authentication, roles, and an admin dashboard upon which CRUD apps can be built. Use TB Core to power content-managed websites or as a quick-and-simple way to add a backend to your existing data models.
|
4
|
+
TB Core is the base Twice Baked engine that provides user authentication, roles, and an admin dashboard upon which CRUD apps can be built. Use TB Core to power content-managed websites or as a quick-and-simple way to add a backend to your existing data models.
|
5
|
+
|
6
|
+
Requirements
|
7
|
+
-----------
|
8
|
+
|
9
|
+
TB Core 1.2.x and higher requires Rails 4 and is developed using Ruby 2.1. Lower versions of Ruby may continue to work but are not heavily tested.
|
10
|
+
|
11
|
+
For Rails 3 compatiblity, stick to TB Core 1.1.x.
|
5
12
|
|
6
13
|
Installation/Usage
|
7
14
|
------------------
|
8
15
|
|
9
16
|
1. In your Gemfile add the following
|
10
17
|
|
18
|
+
gem 'authlogic', :github => 'binarylogic/authlogic', :ref => 'abc09970ed1fad98c6c12f4ca64d1670d37d11db'
|
11
19
|
gem 'tb_core'
|
12
20
|
|
13
21
|
2. Run bundle install
|
@@ -18,6 +26,7 @@ Installation/Usage
|
|
18
26
|
|
19
27
|
4. run a rails server instance and point your browser to /admin
|
20
28
|
|
29
|
+
**Note about Authlogic:** The version of Authlogic up on Rubygems.org at the time of this writing is not fully compatible with Rails 4. Until an improved version is released, we are pointing to a more recent commit that contains various Rails 4 fixes.
|
21
30
|
|
22
31
|
Setup Tasks
|
23
32
|
-----------
|
@@ -42,7 +51,7 @@ The core engine provides various configuration options.
|
|
42
51
|
- `site_name`: Controls the site name displayed in the dashboard and `tb_page_title` view helper.
|
43
52
|
- `from_address`: Sender address used for password resets and other mailers.
|
44
53
|
- `not_found_template`: ERB template used for 404 exceptions. Defaults to `layouts/not_found`.
|
45
|
-
- `production_alert_domain`: When set, displays a prominent warning bar in the admin dashboard directing users to the production domain.
|
54
|
+
- `production_alert_domain`: When set, displays a prominent warning bar in the admin dashboard directing users to the production domain. You should only set this value in `config/environments/staging.rb`.
|
46
55
|
|
47
56
|
Adding Apps to the Dashboard
|
48
57
|
----------------------------
|
@@ -97,6 +106,45 @@ Finally, custom permissions may optionally be tied to one or more dashboard apps
|
|
97
106
|
:apps => [:clients, :projects]
|
98
107
|
}]
|
99
108
|
|
109
|
+
Extending the User Model
|
110
|
+
------------------------
|
111
|
+
|
112
|
+
A common requirement is to add custom fields and functionality to the base `spud_user` model. We have provided several spots where you can do this.
|
113
|
+
|
114
|
+
### Adding custom methods and attributes to the SpudUser class
|
115
|
+
|
116
|
+
Create a file in your app at `app/models/spud_user.rb`, and build a class called `SpudUser` that extends from `Spud::SpudUserModel`. You do not need any explicit requires - the autoloader will take care of the rest.
|
117
|
+
|
118
|
+
class SpudUser < Spud::SpudUserModel
|
119
|
+
has_attached_file :avatar
|
120
|
+
attr_accessible :avatar
|
121
|
+
def say_hello
|
122
|
+
return "Hello, World!"
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
### Adding fields to the add/edit user form
|
127
|
+
|
128
|
+
Create a file in your app at `app/views/admin/users/_form_additions.html.erb`.
|
129
|
+
|
130
|
+
<div class="control-group">
|
131
|
+
<%= f.label :avatar, :class=>"control-label"%>
|
132
|
+
<div class="controls">
|
133
|
+
<%= f.file_field :avatar %>
|
134
|
+
</div>
|
135
|
+
</div>
|
136
|
+
|
137
|
+
### Adding fields to the user show action
|
138
|
+
|
139
|
+
Create a file in your app at `app/views/admin/users/_show_additions.html.erb`.
|
140
|
+
|
141
|
+
<% if @user.avatar_file_name %>
|
142
|
+
<dt>Avatar</dt>
|
143
|
+
<dd>
|
144
|
+
<%= image_tag @user.avatar.url(:thumb) %>
|
145
|
+
</dd>
|
146
|
+
<% end %>
|
147
|
+
|
100
148
|
404 Handling
|
101
149
|
------------
|
102
150
|
|
@@ -1,8 +1,8 @@
|
|
1
1
|
//= require jquery
|
2
2
|
//= require jquery_ujs
|
3
3
|
//= require admin/core/preinit
|
4
|
-
//= require
|
5
|
-
//= require
|
4
|
+
//= require tinymce-jquery
|
5
|
+
//= require tinymce/plugins/tableDropdown/editor_plugin
|
6
6
|
//= require bootstrap/js/bootstrap
|
7
7
|
//= require datepicker/js/bootstrap-datepicker
|
8
8
|
//= require jquery-ui/js/jquery-ui-1.9.1.custom
|
@@ -1 +1 @@
|
|
1
|
-
window.tinyMCEPreInit = {base: "/assets/tiny_mce", suffix:''};
|
1
|
+
//window.tinyMCEPreInit = {base: "/assets/tiny_mce", suffix:''};
|
@@ -11,11 +11,15 @@ spud.admin.users = {
|
|
11
11
|
$('.admin-users-split-pane').on('click', '.admin-user-delete-btn', clickedDeleteUser);
|
12
12
|
$('.admin-users-split-pane').on('submit', '.admin-user-form', submittedUserForm);
|
13
13
|
$('body').on('click', '.split-pane-refresh-btn', clickedRefreshButton);
|
14
|
+
if(typeof(FormData) != 'undefined'){
|
15
|
+
_html5Upload = true;
|
16
|
+
}
|
14
17
|
}
|
15
18
|
};
|
16
19
|
|
17
20
|
var _userHtmlCache;
|
18
21
|
var _previouslySelected;
|
22
|
+
var _html5Upload;
|
19
23
|
|
20
24
|
var clickedAddEditUser = function(e){
|
21
25
|
e.preventDefault();
|
@@ -32,6 +36,11 @@ var clickedAddEditUser = function(e){
|
|
32
36
|
success:function(html){
|
33
37
|
splitPane.setContentAreaHtml(html);
|
34
38
|
splitPane.setToolbarTitle(title);
|
39
|
+
if(!_html5Upload){
|
40
|
+
splitPane.find('input[type=file]').each(function(){
|
41
|
+
$(this).replaceWith('<em>File upload requires an HTML5-capable browser.</em>');
|
42
|
+
});
|
43
|
+
}
|
35
44
|
}
|
36
45
|
});
|
37
46
|
};
|
@@ -61,18 +70,56 @@ var submittedUserForm = function(e){
|
|
61
70
|
e.preventDefault();
|
62
71
|
var form = $(this);
|
63
72
|
var url = form.attr('action');
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
73
|
+
|
74
|
+
var submit = form.find('input[type=submit]');
|
75
|
+
submit.val(submit.attr('data-loading-text')).attr('disabled', true);
|
76
|
+
|
77
|
+
if(_html5Upload){
|
78
|
+
var fd = new FormData();
|
79
|
+
form.find('input, select').each(function(i, input){
|
80
|
+
input = $(input);
|
81
|
+
var name = input.prop('name');
|
82
|
+
var type = input.attr('type');
|
83
|
+
if(type == 'file'){
|
84
|
+
var file = input[0].files[0];
|
85
|
+
if(file !== undefined){
|
86
|
+
fd.append(name, file);
|
87
|
+
}
|
88
|
+
}
|
89
|
+
else if(type == 'checkbox'){
|
90
|
+
if(input.is(':checked')){
|
91
|
+
fd.append(name, input.val());
|
92
|
+
}
|
93
|
+
}
|
94
|
+
else{
|
95
|
+
fd.append(name, input.val());
|
96
|
+
}
|
97
|
+
});
|
98
|
+
var xhr = new XMLHttpRequest();
|
99
|
+
xhr.addEventListener('load', function(e){
|
100
|
+
splitPane.setContentAreaHtml(e.target.response);
|
101
|
+
if(this.status >= 200 && this.status < 400){
|
102
|
+
splitPane.refreshList();
|
103
|
+
}
|
104
|
+
});
|
105
|
+
xhr.open('POST', url);
|
106
|
+
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
|
107
|
+
xhr.send(fd);
|
108
|
+
}
|
109
|
+
else{
|
110
|
+
$.ajax(url, {
|
111
|
+
dataType:'html',
|
112
|
+
type: 'post',
|
113
|
+
data: form.serialize(),
|
114
|
+
success:function(html, textStatus, jqXHR){
|
115
|
+
splitPane.setContentAreaHtml(html);
|
116
|
+
splitPane.refreshList();
|
117
|
+
},
|
118
|
+
error:function(jqXHR, textStatus, errorThrown){
|
119
|
+
splitPane.setContentAreaHtml(jqXHR.responseText);
|
120
|
+
}
|
121
|
+
});
|
122
|
+
}
|
76
123
|
};
|
77
124
|
|
78
125
|
var clickedRefreshButton = function(e){
|
@@ -1,12 +1,12 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
1
|
+
//
|
2
|
+
//Bootstrap v2.2.1
|
3
|
+
//
|
4
|
+
//Copyright 2012 Twitter, Inc
|
5
|
+
//Licensed under the Apache License v2.0
|
6
|
+
//http://www.apache.org/licenses/LICENSE-2.0
|
7
|
+
//
|
8
|
+
//Designed and built with all the love in the world @twitter by @mdo and @fat.
|
9
|
+
//
|
10
10
|
|
11
11
|
article,
|
12
12
|
aside,
|
@@ -2151,7 +2151,7 @@ table th[class*="span"],
|
|
2151
2151
|
*margin-right: .3em;
|
2152
2152
|
line-height: 14px;
|
2153
2153
|
vertical-align: text-top;
|
2154
|
-
background-image: url("
|
2154
|
+
background-image: image-url("bootstrap/img/glyphicons-halflings.png");
|
2155
2155
|
background-position: 14px 14px;
|
2156
2156
|
background-repeat: no-repeat;
|
2157
2157
|
}
|
@@ -2171,7 +2171,7 @@ table th[class*="span"],
|
|
2171
2171
|
.dropdown-menu > .active > a > [class*=" icon-"],
|
2172
2172
|
.dropdown-submenu:hover > a > [class^="icon-"],
|
2173
2173
|
.dropdown-submenu:hover > a > [class*=" icon-"] {
|
2174
|
-
background-image: url("
|
2174
|
+
background-image: image-url("bootstrap/img/glyphicons-halflings-white.png");
|
2175
2175
|
}
|
2176
2176
|
|
2177
2177
|
.icon-glass {
|
File without changes
|
@@ -7,7 +7,7 @@ class Admin::RolesController < Admin::ApplicationController
|
|
7
7
|
add_breadcrumb "Roles", :admin_roles_path
|
8
8
|
|
9
9
|
def index
|
10
|
-
@roles = SpudRole.
|
10
|
+
@roles = SpudRole.includes(:spud_role_permissions)
|
11
11
|
respond_with @roles
|
12
12
|
end
|
13
13
|
|
@@ -21,7 +21,9 @@ class Admin::RolesController < Admin::ApplicationController
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def create
|
24
|
-
|
24
|
+
logger.debug 'role_params:'
|
25
|
+
logger.debug role_params
|
26
|
+
@role = SpudRole.new(role_params)
|
25
27
|
flash[:notice] = 'SpudRole created successfully' if @role.save
|
26
28
|
respond_with @role, :location => admin_roles_path
|
27
29
|
end
|
@@ -31,8 +33,8 @@ class Admin::RolesController < Admin::ApplicationController
|
|
31
33
|
end
|
32
34
|
|
33
35
|
def update
|
34
|
-
|
35
|
-
if @role.update_attributes(
|
36
|
+
#role_params[:permission_tags] ||= []
|
37
|
+
if @role.update_attributes(role_params)
|
36
38
|
flash[:notice] = 'SpudRole updated successfully'
|
37
39
|
end
|
38
40
|
respond_with @role, :location => admin_roles_path
|
@@ -55,4 +57,8 @@ class Admin::RolesController < Admin::ApplicationController
|
|
55
57
|
end
|
56
58
|
end
|
57
59
|
|
60
|
+
def role_params
|
61
|
+
params.require(:spud_role).permit(:name, :permission_tags => [])
|
62
|
+
end
|
63
|
+
|
58
64
|
end
|
@@ -14,10 +14,18 @@ class Admin::SettingsController < Admin::ApplicationController
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def update
|
17
|
-
if @current_user.update_attributes(
|
17
|
+
if @current_user.update_attributes(user_params)
|
18
18
|
flash[:notice] = "User settings saved successfully."
|
19
|
+
respond_with @current_user, :location => admin_settings_path
|
20
|
+
else
|
21
|
+
render 'edit'
|
19
22
|
end
|
20
|
-
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def user_params
|
28
|
+
params.require(:spud_user).permit(:login, :first_name, :last_name, :email, :password, :password_confirmation, :time_zone)
|
21
29
|
end
|
22
30
|
|
23
31
|
end
|
@@ -12,7 +12,7 @@ class Admin::SetupController < Admin::ApplicationController
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def create
|
15
|
-
@spud_user = SpudUser.new(
|
15
|
+
@spud_user = SpudUser.new(user_params)
|
16
16
|
@spud_user.super_admin = true
|
17
17
|
if @spud_user.save
|
18
18
|
redirect_to admin_root_path
|
@@ -21,4 +21,10 @@ class Admin::SetupController < Admin::ApplicationController
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
+
private
|
25
|
+
|
26
|
+
def user_params
|
27
|
+
params.require(:spud_user).permit(:login, :email, :password, :password_confirmation)
|
28
|
+
end
|
29
|
+
|
24
30
|
end
|
@@ -33,7 +33,7 @@ class Admin::UsersController < Admin::ApplicationController
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def create
|
36
|
-
@user = SpudUser.new(
|
36
|
+
@user = SpudUser.new(user_params)
|
37
37
|
if @user.save
|
38
38
|
render 'show', :status => 200
|
39
39
|
else
|
@@ -46,7 +46,7 @@ class Admin::UsersController < Admin::ApplicationController
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def update
|
49
|
-
@user.update_attributes(
|
49
|
+
@user.update_attributes(user_params)
|
50
50
|
respond_with @user, :location => admin_user_path(@user), :status => 200
|
51
51
|
end
|
52
52
|
|
@@ -66,4 +66,10 @@ private
|
|
66
66
|
return true
|
67
67
|
end
|
68
68
|
|
69
|
+
# attr_accessible :login,:email,:first_name,:last_name,:password,:password_confirmation,:password_salt,:last_login_at,:last_request_at,:last_login_ip,:failed_login_count,:current_login_at,:login_count,:persistence_token,:perishable_token,:single_access_token,:crypted_password, :current_login_ip, :created_at, :updated_at,:time_zone, :as => [:default, :admin]
|
70
|
+
# attr_accessible :super_admin, :spud_role_id, :id, :as => :admin
|
71
|
+
def user_params
|
72
|
+
params.require(:spud_user).permit!
|
73
|
+
end
|
74
|
+
|
69
75
|
end
|
@@ -1,8 +1,7 @@
|
|
1
1
|
class Spud::ApplicationController < ActionController::Base
|
2
2
|
|
3
|
-
unloadable
|
4
3
|
protect_from_forgery
|
5
|
-
helper_method :current_user_session, :current_user
|
4
|
+
helper_method :current_user_session, :current_user, :current_user_id
|
6
5
|
around_filter :set_time_zone
|
7
6
|
|
8
7
|
if Spud::Core.multisite_mode_enabled
|
@@ -33,6 +32,14 @@ private
|
|
33
32
|
@current_user = current_user_session && current_user_session.spud_user
|
34
33
|
end
|
35
34
|
|
35
|
+
def current_user_id
|
36
|
+
if @current_user
|
37
|
+
return @current_user.id
|
38
|
+
else
|
39
|
+
0
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
36
43
|
def require_user
|
37
44
|
unless current_user
|
38
45
|
store_location
|
@@ -24,4 +24,25 @@ module Spud::ApplicationHelper
|
|
24
24
|
return config[:site_id] unless config.blank?
|
25
25
|
end
|
26
26
|
|
27
|
+
def cache_key_for_spud_collection(collection, key:'view', cache_params:[], for_user:false)
|
28
|
+
cache_keys = [controller_name, action_name, key]
|
29
|
+
cache_keys << collection.collect(&:updated_at).max().try(:utc).try(:to_i)
|
30
|
+
if for_user
|
31
|
+
cache_keys << current_user_id
|
32
|
+
end
|
33
|
+
if cache_params.any?
|
34
|
+
cache_keys += cache_params.collect{ |cache_param| params[cache_param] || 'nil' }
|
35
|
+
end
|
36
|
+
if Spud::Core.multisite_mode_enabled
|
37
|
+
cache_keys.unshift(current_site_id)
|
38
|
+
end
|
39
|
+
cache_keys += collection.collect(&:id)
|
40
|
+
cache_key = cache_keys.join('/')
|
41
|
+
if cache_key.length > 250
|
42
|
+
return Digest::SHA1.hexdigest(cache_key)
|
43
|
+
else
|
44
|
+
return cache_key
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
27
48
|
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
class Spud::SpudUserModel < ActiveRecord::Base
|
2
|
+
self.table_name = 'spud_users'
|
3
|
+
acts_as_authentic
|
4
|
+
|
5
|
+
belongs_to :role, :class_name => 'SpudRole', :foreign_key => 'spud_role_id'
|
6
|
+
has_many :spud_user_settings
|
7
|
+
|
8
|
+
def full_name
|
9
|
+
if first_name.blank? && last_name.blank?
|
10
|
+
return self.login
|
11
|
+
end
|
12
|
+
if self.first_name.blank?
|
13
|
+
return self.last_name
|
14
|
+
elsif self.last_name.blank?
|
15
|
+
return self.first_name
|
16
|
+
end
|
17
|
+
return "#{self.first_name} #{self.last_name}"
|
18
|
+
end
|
19
|
+
|
20
|
+
# Returns true if user can view at least one dashboard app
|
21
|
+
def has_admin_rights?
|
22
|
+
if self.super_admin?
|
23
|
+
return true
|
24
|
+
else
|
25
|
+
return Spud::Core.admin_applications.find{ |app| self.can_view_app?(app) }.present?
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Returns true if the user can view a spud app based on it's key
|
30
|
+
def can_view_app?(admin_application)
|
31
|
+
if self.super_admin?
|
32
|
+
return true
|
33
|
+
else
|
34
|
+
key = admin_application[:key]
|
35
|
+
return self.permissions.find{ |p| p.apps.include?(key) }.present?
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# Check if a user has a given list of permissions
|
40
|
+
#
|
41
|
+
# * if one tag is supplied, return true if the tag matches
|
42
|
+
# * if multiple tags are supplied, return true if ALL tags match
|
43
|
+
def has_permission?(*tags)
|
44
|
+
if self.super_admin?
|
45
|
+
return true
|
46
|
+
else
|
47
|
+
my_tags = self.permissions.collect(&:tag)
|
48
|
+
return tags.find{ |tag| !my_tags.include?(tag) }.blank?
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# Check if a user has at least one out of a given list of permissions
|
53
|
+
#
|
54
|
+
# * if one tag is supplied, return true if the tag matches
|
55
|
+
# * if multiple tags are supplied, return true if ANY tag matches
|
56
|
+
def has_any_permission?(*tags)
|
57
|
+
if self.super_admin?
|
58
|
+
return true
|
59
|
+
else
|
60
|
+
return self.permissions.find{ |p| tags.include?(p.tag) }.present?
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# Return a list of SpudPermission objects for the user's SpudRole
|
65
|
+
def permissions
|
66
|
+
if !self.role
|
67
|
+
return []
|
68
|
+
else
|
69
|
+
return self.role.permissions
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# Returns an ActiveRecord::Relation performing a LIKE query against name columns
|
74
|
+
def self.where_name_like(string)
|
75
|
+
like = '%' + string + '%'
|
76
|
+
return self.where('login like ? or concat(`first_name`, " ", `last_name`) like ?', like, like)
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
data/app/models/spud_role.rb
CHANGED
data/app/models/spud_user.rb
CHANGED
@@ -1,81 +1,3 @@
|
|
1
|
-
class SpudUser <
|
2
|
-
|
3
|
-
|
4
|
-
belongs_to :role, :class_name => 'SpudRole', :foreign_key => 'spud_role_id'
|
5
|
-
has_many :spud_user_settings
|
6
|
-
|
7
|
-
attr_accessible :login,:email,:first_name,:last_name,:password,:password_confirmation,:password_salt,:last_login_at,:last_request_at,:last_login_ip,:failed_login_count,:current_login_at,:login_count,:persistence_token,:perishable_token,:single_access_token,:crypted_password, :current_login_ip, :created_at, :updated_at,:time_zone, :as => [:default, :admin]
|
8
|
-
attr_accessible :super_admin, :spud_role_id, :id, :as => :admin
|
9
|
-
|
10
|
-
def full_name
|
11
|
-
if first_name.blank? && last_name.blank?
|
12
|
-
return self.login
|
13
|
-
end
|
14
|
-
if self.first_name.blank?
|
15
|
-
return self.last_name
|
16
|
-
elsif self.last_name.blank?
|
17
|
-
return self.first_name
|
18
|
-
end
|
19
|
-
return "#{self.first_name} #{self.last_name}"
|
20
|
-
end
|
21
|
-
|
22
|
-
# Returns true if user can view at least one dashboard app
|
23
|
-
def has_admin_rights?
|
24
|
-
if self.super_admin?
|
25
|
-
return true
|
26
|
-
else
|
27
|
-
return Spud::Core.admin_applications.find{ |app| self.can_view_app?(app) }.present?
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
# Returns true if the user can view a spud app based on it's key
|
32
|
-
def can_view_app?(admin_application)
|
33
|
-
if self.super_admin?
|
34
|
-
return true
|
35
|
-
else
|
36
|
-
key = admin_application[:key]
|
37
|
-
return self.permissions.find{ |p| p.apps.include?(key) }.present?
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
# Check if a user has a given list of permissions
|
42
|
-
#
|
43
|
-
# * if one tag is supplied, return true if the tag matches
|
44
|
-
# * if multiple tags are supplied, return true if ALL tags match
|
45
|
-
def has_permission?(*tags)
|
46
|
-
if self.super_admin?
|
47
|
-
return true
|
48
|
-
else
|
49
|
-
my_tags = self.permissions.collect(&:tag)
|
50
|
-
return tags.find{ |tag| !my_tags.include?(tag) }.blank?
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
# Check if a user has at least one out of a given list of permissions
|
55
|
-
#
|
56
|
-
# * if one tag is supplied, return true if the tag matches
|
57
|
-
# * if multiple tags are supplied, return true if ANY tag matches
|
58
|
-
def has_any_permission?(*tags)
|
59
|
-
if self.super_admin?
|
60
|
-
return true
|
61
|
-
else
|
62
|
-
return self.permissions.find{ |p| tags.include?(p.tag) }.present?
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
# Return a list of SpudPermission objects for the user's SpudRole
|
67
|
-
def permissions
|
68
|
-
if !self.role
|
69
|
-
return []
|
70
|
-
else
|
71
|
-
return self.role.permissions
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
# Returns an ActiveRecord::Relation performing a LIKE query against name columns
|
76
|
-
def self.where_name_like(string)
|
77
|
-
like = '%' + string + '%'
|
78
|
-
return self.where('login like ? or concat(`first_name`, " ", `last_name`) like ?', like, like)
|
79
|
-
end
|
80
|
-
|
1
|
+
class SpudUser < Spud::SpudUserModel
|
2
|
+
# Copy this file to your app to extend the base SpudUser model
|
81
3
|
end
|
@@ -5,11 +5,12 @@
|
|
5
5
|
<% end %>
|
6
6
|
|
7
7
|
<% content_for :detail do %>
|
8
|
-
<table class="
|
8
|
+
<table class="table table-striped">
|
9
9
|
<thead>
|
10
10
|
<tr>
|
11
11
|
<th>Name</th>
|
12
12
|
<th># Users</th>
|
13
|
+
<th>Permissions</th>
|
13
14
|
<th></th>
|
14
15
|
</tr>
|
15
16
|
</thead>
|
@@ -18,9 +19,10 @@
|
|
18
19
|
<tr>
|
19
20
|
<td><%= role.name %></td>
|
20
21
|
<td><%= role.users.count %></td>
|
22
|
+
<td><%= role.permissions.collect(&:name).join(', ') %></td>
|
21
23
|
<td align="right">
|
22
24
|
<%= link_to 'Edit', edit_admin_role_path(role), :class => 'btn btn-mini' %>
|
23
|
-
<%= link_to 'Delete', admin_role_path(role), :method => :delete, :confirm => 'Are you sure?', :class => 'btn btn-mini btn-danger' %>
|
25
|
+
<%= link_to 'Delete', admin_role_path(role), :method => :delete, :data => {:confirm => 'Are you sure?'}, :class => 'btn btn-mini btn-danger' %>
|
24
26
|
</td>
|
25
27
|
</tr>
|
26
28
|
<% end %>
|