From e59d11e1c90787dcdaa6bfe964f174b300b352c8 Mon Sep 17 00:00:00 2001 From: Alexander Negoda Date: Wed, 25 Jul 2012 01:26:16 +0400 Subject: [PATCH] big update --- .../jquery.plupload.queue.scssc | Bin 0 -> 20783 bytes .../jquery.plupload.queue.scssc | Bin 0 -> 21157 bytes .../jquery.ui.plupload.scssc | Bin 0 -> 16769 bytes Gemfile | 34 +- Gemfile.lock | 153 +++++++- Rakefile | 2 +- app/assets/javascripts/application.js | 18 + app/assets/javascripts/bootstrap.js.coffee | 4 + app/assets/stylesheets/application.css | 254 +------------ .../bootstrap_and_overrides.css.less | 32 ++ .../stylesheets/jquery.plupload.queue.scss | 20 +- .../stylesheets/jquery.ui.plupload.scss | 5 +- .../admin/application_controller.rb | 5 - app/controllers/admin/users_controller.rb | 47 --- app/controllers/albums_controller.rb | 6 +- app/controllers/application_controller.rb | 91 +---- app/controllers/collections_controller.rb | 7 +- app/controllers/locale_controller.rb | 14 + app/controllers/photos_controller.rb | 16 +- app/controllers/user_sessions_controller.rb | 24 -- app/controllers/users_controller.rb | 3 +- app/helpers/users_helper.rb | 8 +- app/models/ability.rb | 63 ++++ app/models/album.rb | 4 +- app/models/collection.rb | 3 + app/models/permission.rb | 19 - app/models/photo.rb | 21 +- app/models/role.rb | 15 +- app/models/role_membership.rb | 36 -- app/models/user.rb | 43 ++- app/models/user_session.rb | 6 - app/uploaders/file_uploader.rb | 32 +- app/uploaders/userpic_uploader.rb | 21 ++ app/views/admin/users/_form.html.erb | 12 - app/views/admin/users/edit.html.erb | 15 - app/views/admin/users/index.html.erb | 7 - app/views/admin/users/new.html.erb | 7 - app/views/admin/users/show.html.erb | 45 --- app/views/albums/show.html.erb | 2 +- app/views/collections/_form.html.erb | 2 +- app/views/collections/index.html.erb | 36 +- app/views/collections/show.html.erb | 2 +- app/views/devise/_links.erb | 24 ++ app/views/devise/confirmations/new.html.erb | 12 + .../mailer/confirmation_instructions.html.erb | 5 + .../reset_password_instructions.html.erb | 8 + .../mailer/unlock_instructions.html.erb | 7 + app/views/devise/passwords/edit.html.erb | 16 + app/views/devise/passwords/new.html.erb | 12 + app/views/devise/registrations/edit.html.erb | 25 ++ app/views/devise/registrations/new.html.erb | 18 + app/views/devise/sessions/new.html.erb | 17 + app/views/devise/unlocks/new.html.erb | 12 + app/views/layouts/application.html.erb | 11 +- app/views/layouts/bootstrap.html.erb | 29 ++ app/views/photos/_form.html.erb | 10 +- app/views/photos/_photo.pdf.erb | 2 +- app/views/photos/_thumb.html.erb | 2 +- app/views/photos/edit.html.erb | 20 +- app/views/photos/edit_multiple.html.erb | 26 +- app/views/photos/index.html.erb | 6 +- app/views/photos/show.html.erb | 54 +-- app/views/photos/untouched.html.erb | 22 +- app/views/photos/upload.html.erb | 11 +- app/views/shared/_head.html.erb | 36 ++ app/views/shared/_nav_bar.html.erb | 25 ++ app/views/shared/_user_links.html.erb | 14 + app/views/users/show.html.erb | 36 +- config.ru | 2 +- config/application.rb | 5 +- config/application_config.rb | 55 +++ config/database.example.yml | 10 +- config/environment.rb | 6 +- config/environments/development.rb | 23 +- config/environments/production.rb | 48 ++- config/environments/test.rb | 2 +- config/initializers/carrier_wave.rb | 1 + config/initializers/configatron.rb | 2 + config/initializers/devise.rb | 232 ++++++++++++ config/initializers/hack.rb | 1 + config/initializers/inflections.rb | 5 + config/initializers/mime_types.rb | 3 +- config/initializers/secret_token.rb | 2 +- config/initializers/session_store.rb | 4 +- config/locales/devise.en.yml | 58 +++ config/{balder.rb => photomix.rb} | 0 config/routes.rb | 25 +- config/yettings/devise_omniauth_engine.yml | 15 + db/migrate/20090520165238_create_photos.rb | 2 +- db/migrate/20090522131931_create_users.rb | 69 ++-- db/migrate/20090528152114_add_name_to_user.rb | 9 - .../20090604202928_create_permissions.rb | 16 - .../20090604202929_create_role_memberships.rb | 15 - db/migrate/20090604202930_create_roles.rb | 13 +- .../20100412220801_add_file_to_photo.rb | 4 +- db/schema.rb | 76 ++-- db/seeds.rb | 29 +- lib/acts_as_permissible.rb | 106 ------ lib/ext/group_for.rb | 13 + lib/scan.rb | 2 +- .../lib/.gitignore => lib/tasks/.gitkeep | 0 lib/tasks/db.rake | 11 + test/blueprints.rb | 71 ++++ .../assets/javascripts/plupload/changelog.txt | 218 ----------- .../assets/javascripts/plupload/js/i18n/cs.js | 14 - .../assets/javascripts/plupload/js/i18n/da.js | 12 - .../assets/javascripts/plupload/js/i18n/de.js | 24 -- .../assets/javascripts/plupload/js/i18n/el.js | 14 - .../assets/javascripts/plupload/js/i18n/es.js | 25 -- .../assets/javascripts/plupload/js/i18n/et.js | 33 -- .../assets/javascripts/plupload/js/i18n/fa.js | 37 -- .../assets/javascripts/plupload/js/i18n/fi.js | 33 -- .../javascripts/plupload/js/i18n/fr-ca.js | 35 -- .../assets/javascripts/plupload/js/i18n/fr.js | 25 -- .../assets/javascripts/plupload/js/i18n/hr.js | 25 -- .../assets/javascripts/plupload/js/i18n/hu.js | 33 -- .../assets/javascripts/plupload/js/i18n/it.js | 24 -- .../assets/javascripts/plupload/js/i18n/ja.js | 37 -- .../assets/javascripts/plupload/js/i18n/ko.js | 36 -- .../assets/javascripts/plupload/js/i18n/lv.js | 33 -- .../assets/javascripts/plupload/js/i18n/nl.js | 21 -- .../assets/javascripts/plupload/js/i18n/pl.js | 24 -- .../javascripts/plupload/js/i18n/pt-br.js | 35 -- .../assets/javascripts/plupload/js/i18n/ro.js | 24 -- .../assets/javascripts/plupload/js/i18n/ru.js | 21 -- .../assets/javascripts/plupload/js/i18n/sr.js | 14 - .../assets/javascripts/plupload/js/i18n/sv.js | 12 - .../jquery.plupload.queue/img/backgrounds.gif | Bin 2977 -> 0 bytes .../img/buttons-disabled.png | Bin 1292 -> 0 bytes .../js/jquery.plupload.queue/img/buttons.png | Bin 1439 -> 0 bytes .../js/jquery.plupload.queue/img/delete.gif | Bin 180 -> 0 bytes .../js/jquery.plupload.queue/img/done.gif | Bin 1024 -> 0 bytes .../js/jquery.plupload.queue/img/error.gif | Bin 994 -> 0 bytes .../js/jquery.plupload.queue/img/throbber.gif | Bin 1922 -> 0 bytes .../js/jquery.plupload.queue/img/transp50.png | Bin 399 -> 0 bytes .../jquery.plupload.queue.js | 1 - .../js/jquery.ui.plupload/img/plupload-bw.png | Bin 2105 -> 0 bytes .../js/jquery.ui.plupload/img/plupload.png | Bin 3641 -> 0 bytes .../jquery.ui.plupload/jquery.ui.plupload.js | 1 - .../plupload/js/plupload.browserplus.js | 1 - .../javascripts/plupload/js/plupload.flash.js | 1 - .../plupload/js/plupload.flash.swf | Bin 18873 -> 0 bytes .../javascripts/plupload/js/plupload.full.js | 2 - .../javascripts/plupload/js/plupload.gears.js | 1 - .../javascripts/plupload/js/plupload.html4.js | 1 - .../javascripts/plupload/js/plupload.html5.js | 1 - .../javascripts/plupload/js/plupload.js | 2 - .../plupload/js/plupload.silverlight.js | 1 - .../plupload/js/plupload.silverlight.xap | Bin 44013 -> 0 bytes .../assets/javascripts/plupload/license.txt | 339 ------------------ vendor/assets/javascripts/plupload/readme.md | 46 --- vendor/plugins/acts_as_permissible/.gitignore | 1 - .../plugins/acts_as_permissible/MIT-LICENSE | 20 -- vendor/plugins/acts_as_permissible/README | 68 ---- vendor/plugins/acts_as_permissible/Rakefile | 22 -- .../generators/permissible/USAGE | 1 - .../permissible/permissible_generator.rb | 154 -------- .../templates/acts_as_permissible.rb | 106 ------ .../templates/acts_as_permissible_spec.rb | 208 ----------- .../permissible/templates/fixtures.yml | 48 --- .../permissible/templates/initializer.rb | 2 - .../permissible/templates/migration.rb | 16 - .../generators/permissible/templates/model.rb | 19 - .../permissible/templates/model_spec.rb | 51 --- .../templates/role_membership_migration.rb | 15 - .../templates/role_membership_model.rb | 36 -- .../role_membership_model_fixtures.yml | 25 -- .../templates/role_membership_model_spec.rb | 100 ------ .../permissible/templates/role_migration.rb | 13 - .../permissible/templates/role_model.rb | 12 - .../templates/role_model_fixtures.yml | 15 - .../permissible/templates/role_model_spec.rb | 53 --- vendor/plugins/acts_as_permissible/init.rb | 7 - vendor/plugins/acts_as_permissible/install.rb | 1 - .../lib/tasks/acts_as_permissible_tasks.rake | 4 - .../test/acts_as_permissible_test.rb | 8 - .../plugins/acts_as_permissible/uninstall.rb | 1 - 177 files changed, 1513 insertions(+), 3228 deletions(-) create mode 100644 .sass-cache/53c0ce4446c54bca21eabbfde8aea9e680be8c1a/jquery.plupload.queue.scssc create mode 100644 .sass-cache/fb46dcf1b33fcd526ffc989de0c2b6e51630b35f/jquery.plupload.queue.scssc create mode 100644 .sass-cache/fb46dcf1b33fcd526ffc989de0c2b6e51630b35f/jquery.ui.plupload.scssc create mode 100644 app/assets/javascripts/application.js create mode 100644 app/assets/javascripts/bootstrap.js.coffee create mode 100644 app/assets/stylesheets/bootstrap_and_overrides.css.less rename vendor/assets/javascripts/plupload/js/jquery.plupload.queue/css/jquery.plupload.queue.css => app/assets/stylesheets/jquery.plupload.queue.scss (79%) rename vendor/assets/javascripts/plupload/js/jquery.ui.plupload/css/jquery.ui.plupload.css => app/assets/stylesheets/jquery.ui.plupload.scss (90%) delete mode 100644 app/controllers/admin/application_controller.rb delete mode 100644 app/controllers/admin/users_controller.rb create mode 100644 app/controllers/locale_controller.rb delete mode 100644 app/controllers/user_sessions_controller.rb create mode 100644 app/models/ability.rb delete mode 100644 app/models/permission.rb delete mode 100644 app/models/role_membership.rb delete mode 100644 app/models/user_session.rb create mode 100644 app/uploaders/userpic_uploader.rb delete mode 100644 app/views/admin/users/_form.html.erb delete mode 100644 app/views/admin/users/edit.html.erb delete mode 100644 app/views/admin/users/index.html.erb delete mode 100644 app/views/admin/users/new.html.erb delete mode 100644 app/views/admin/users/show.html.erb create mode 100644 app/views/devise/_links.erb create mode 100644 app/views/devise/confirmations/new.html.erb create mode 100644 app/views/devise/mailer/confirmation_instructions.html.erb create mode 100644 app/views/devise/mailer/reset_password_instructions.html.erb create mode 100644 app/views/devise/mailer/unlock_instructions.html.erb create mode 100644 app/views/devise/passwords/edit.html.erb create mode 100644 app/views/devise/passwords/new.html.erb create mode 100644 app/views/devise/registrations/edit.html.erb create mode 100644 app/views/devise/registrations/new.html.erb create mode 100644 app/views/devise/sessions/new.html.erb create mode 100644 app/views/devise/unlocks/new.html.erb create mode 100644 app/views/layouts/bootstrap.html.erb create mode 100644 app/views/shared/_head.html.erb create mode 100644 app/views/shared/_nav_bar.html.erb create mode 100644 app/views/shared/_user_links.html.erb create mode 100644 config/application_config.rb create mode 100644 config/initializers/carrier_wave.rb create mode 100644 config/initializers/configatron.rb create mode 100644 config/initializers/devise.rb create mode 100644 config/initializers/hack.rb create mode 100644 config/locales/devise.en.yml rename config/{balder.rb => photomix.rb} (100%) create mode 100644 config/yettings/devise_omniauth_engine.yml delete mode 100644 db/migrate/20090528152114_add_name_to_user.rb delete mode 100644 db/migrate/20090604202928_create_permissions.rb delete mode 100644 db/migrate/20090604202929_create_role_memberships.rb delete mode 100644 lib/acts_as_permissible.rb create mode 100644 lib/ext/group_for.rb rename vendor/plugins/acts_as_permissible/lib/.gitignore => lib/tasks/.gitkeep (100%) create mode 100644 lib/tasks/db.rake create mode 100644 test/blueprints.rb delete mode 100644 vendor/assets/javascripts/plupload/changelog.txt delete mode 100644 vendor/assets/javascripts/plupload/js/i18n/cs.js delete mode 100644 vendor/assets/javascripts/plupload/js/i18n/da.js delete mode 100644 vendor/assets/javascripts/plupload/js/i18n/de.js delete mode 100644 vendor/assets/javascripts/plupload/js/i18n/el.js delete mode 100644 vendor/assets/javascripts/plupload/js/i18n/es.js delete mode 100644 vendor/assets/javascripts/plupload/js/i18n/et.js delete mode 100644 vendor/assets/javascripts/plupload/js/i18n/fa.js delete mode 100644 vendor/assets/javascripts/plupload/js/i18n/fi.js delete mode 100644 vendor/assets/javascripts/plupload/js/i18n/fr-ca.js delete mode 100644 vendor/assets/javascripts/plupload/js/i18n/fr.js delete mode 100644 vendor/assets/javascripts/plupload/js/i18n/hr.js delete mode 100644 vendor/assets/javascripts/plupload/js/i18n/hu.js delete mode 100644 vendor/assets/javascripts/plupload/js/i18n/it.js delete mode 100644 vendor/assets/javascripts/plupload/js/i18n/ja.js delete mode 100644 vendor/assets/javascripts/plupload/js/i18n/ko.js delete mode 100644 vendor/assets/javascripts/plupload/js/i18n/lv.js delete mode 100644 vendor/assets/javascripts/plupload/js/i18n/nl.js delete mode 100644 vendor/assets/javascripts/plupload/js/i18n/pl.js delete mode 100644 vendor/assets/javascripts/plupload/js/i18n/pt-br.js delete mode 100644 vendor/assets/javascripts/plupload/js/i18n/ro.js delete mode 100644 vendor/assets/javascripts/plupload/js/i18n/ru.js delete mode 100644 vendor/assets/javascripts/plupload/js/i18n/sr.js delete mode 100644 vendor/assets/javascripts/plupload/js/i18n/sv.js delete mode 100644 vendor/assets/javascripts/plupload/js/jquery.plupload.queue/img/backgrounds.gif delete mode 100644 vendor/assets/javascripts/plupload/js/jquery.plupload.queue/img/buttons-disabled.png delete mode 100644 vendor/assets/javascripts/plupload/js/jquery.plupload.queue/img/buttons.png delete mode 100644 vendor/assets/javascripts/plupload/js/jquery.plupload.queue/img/delete.gif delete mode 100644 vendor/assets/javascripts/plupload/js/jquery.plupload.queue/img/done.gif delete mode 100644 vendor/assets/javascripts/plupload/js/jquery.plupload.queue/img/error.gif delete mode 100644 vendor/assets/javascripts/plupload/js/jquery.plupload.queue/img/throbber.gif delete mode 100644 vendor/assets/javascripts/plupload/js/jquery.plupload.queue/img/transp50.png delete mode 100644 vendor/assets/javascripts/plupload/js/jquery.plupload.queue/jquery.plupload.queue.js delete mode 100644 vendor/assets/javascripts/plupload/js/jquery.ui.plupload/img/plupload-bw.png delete mode 100644 vendor/assets/javascripts/plupload/js/jquery.ui.plupload/img/plupload.png delete mode 100644 vendor/assets/javascripts/plupload/js/jquery.ui.plupload/jquery.ui.plupload.js delete mode 100644 vendor/assets/javascripts/plupload/js/plupload.browserplus.js delete mode 100644 vendor/assets/javascripts/plupload/js/plupload.flash.js delete mode 100644 vendor/assets/javascripts/plupload/js/plupload.flash.swf delete mode 100644 vendor/assets/javascripts/plupload/js/plupload.full.js delete mode 100644 vendor/assets/javascripts/plupload/js/plupload.gears.js delete mode 100644 vendor/assets/javascripts/plupload/js/plupload.html4.js delete mode 100644 vendor/assets/javascripts/plupload/js/plupload.html5.js delete mode 100644 vendor/assets/javascripts/plupload/js/plupload.js delete mode 100644 vendor/assets/javascripts/plupload/js/plupload.silverlight.js delete mode 100644 vendor/assets/javascripts/plupload/js/plupload.silverlight.xap delete mode 100644 vendor/assets/javascripts/plupload/license.txt delete mode 100644 vendor/assets/javascripts/plupload/readme.md delete mode 100644 vendor/plugins/acts_as_permissible/.gitignore delete mode 100644 vendor/plugins/acts_as_permissible/MIT-LICENSE delete mode 100644 vendor/plugins/acts_as_permissible/README delete mode 100644 vendor/plugins/acts_as_permissible/Rakefile delete mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/USAGE delete mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/permissible_generator.rb delete mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/acts_as_permissible.rb delete mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/acts_as_permissible_spec.rb delete mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/fixtures.yml delete mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/initializer.rb delete mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/migration.rb delete mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/model.rb delete mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/model_spec.rb delete mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/role_membership_migration.rb delete mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/role_membership_model.rb delete mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/role_membership_model_fixtures.yml delete mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/role_membership_model_spec.rb delete mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/role_migration.rb delete mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/role_model.rb delete mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/role_model_fixtures.yml delete mode 100644 vendor/plugins/acts_as_permissible/generators/permissible/templates/role_model_spec.rb delete mode 100644 vendor/plugins/acts_as_permissible/init.rb delete mode 100644 vendor/plugins/acts_as_permissible/install.rb delete mode 100644 vendor/plugins/acts_as_permissible/lib/tasks/acts_as_permissible_tasks.rake delete mode 100644 vendor/plugins/acts_as_permissible/test/acts_as_permissible_test.rb delete mode 100644 vendor/plugins/acts_as_permissible/uninstall.rb diff --git a/.sass-cache/53c0ce4446c54bca21eabbfde8aea9e680be8c1a/jquery.plupload.queue.scssc b/.sass-cache/53c0ce4446c54bca21eabbfde8aea9e680be8c1a/jquery.plupload.queue.scssc new file mode 100644 index 0000000000000000000000000000000000000000..f8a7c6130e43ca2b8dc0ab23786868e8ff3bd3cc GIT binary patch literal 20783 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 SV 'mime/types' gem 'carrierwave', '0.6.2' gem 'dynamic_form' gem 'princely' gem 'jquery-rails' gem 'jquery-ui-rails' +gem 'twitter-bootstrap-rails', :git => 'git://github.com/seyhunak/twitter-bootstrap-rails.git' +gem 'configatron', :git => 'git://github.com/markbates/configatron.git' +gem 'plupload-rails', :git => 'git://github.com/bryanmig/plupload-rails.git' +gem 'sequel', :git => 'git://github.com/jeremyevans/sequel.git' gem 'russian', :git => 'git://github.com/yaroslav/russian.git' -# -- Heroku -#gem 'heroku' -#gem 'pg' +gem "devise_omniauth_engine", :git=>"git://github.com/greendog/devise_omniauth_engine.git" +gem 'omniauth-twitter' +gem 'omniauth-facebook' +gem 'omniauth-openid' +gem 'omniauth-google-apps' +gem 'omniauth-vkontakte', :git => 'git://github.com/mamantoha/omniauth-vkontakte.git' +gem 'cancan' -# -- Database -# SQLite: -group :development do - gem 'sqlite3-ruby' +group :assets do + gem 'sass-rails' + gem 'coffee-rails' + gem 'uglifier' +end + +group :development do + gem 'sqlite3' + gem 'ffaker' + gem 'machinist' end -# MySQL: -#gem 'mysql2' -# PostgreSQL: -#gem 'pg' # -- Cloud storage # AWS S3 support. Can be disabled if using local file system instead of cloud storage. diff --git a/Gemfile.lock b/Gemfile.lock index df83b35..3de58f5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,3 +1,51 @@ +GIT + remote: git://github.com/bryanmig/plupload-rails.git + revision: 6d07d0f7e05d0b3fdc9b03b49d3a7c3aa1cd703b + specs: + plupload-rails (1.0.6) + rails (~> 3.1) + +GIT + remote: git://github.com/greendog/devise_omniauth_engine.git + revision: c46d449222133f709b5f0cafc31a57f1ae208f06 + specs: + devise_omniauth_engine (1.0.0) + devise + omniauth + yettings + +GIT + remote: git://github.com/jeremyevans/sequel.git + revision: 4b3396b47fdec748a4ed8fae8f6745d2fb5f1f71 + specs: + sequel (3.37.0) + +GIT + remote: git://github.com/mamantoha/omniauth-vkontakte.git + revision: 1d7fc5bdb3b90db2f51a9f3d5f4e6a14b97a2b41 + specs: + omniauth-vkontakte (1.0.7) + multi_json + omniauth (~> 1.1.0) + omniauth-oauth2 (~> 1.0) + +GIT + remote: git://github.com/markbates/configatron.git + revision: 7a81defa5e1fb032b5ed62754d7e6d7bfecf07a2 + specs: + configatron (2.9.1) + yamler (>= 0.1.0) + +GIT + remote: git://github.com/seyhunak/twitter-bootstrap-rails.git + revision: 087c17e4294ce10aeb80d31fe7388a2a524460dd + specs: + twitter-bootstrap-rails (2.1.1) + actionpack (>= 3.1) + less-rails (~> 2.2.3) + railties (>= 3.1) + therubyracer (= 0.10.1) + GIT remote: git://github.com/yaroslav/russian.git revision: e2dde13672bcee176f8b0be364a55ac256913231 @@ -36,16 +84,33 @@ GEM i18n (~> 0.6) multi_json (~> 1.0) arel (3.0.2) - authlogic (3.1.3) - activerecord (>= 3.0.0) - activesupport (>= 3.0.0) + bcrypt-ruby (3.0.1) builder (3.0.0) + cancan (1.6.8) carrierwave (0.6.2) activemodel (>= 3.2.0) activesupport (>= 3.2.0) + coffee-rails (3.2.2) + coffee-script (>= 2.2.0) + railties (~> 3.2.0) + coffee-script (2.2.0) + coffee-script-source + execjs + coffee-script-source (1.3.3) + commonjs (0.2.6) + devise (2.1.2) + bcrypt-ruby (~> 3.0) + orm_adapter (~> 0.1) + railties (~> 3.1) + warden (~> 1.2.1) dynamic_form (1.1.4) erubis (2.7.0) excon (0.14.3) + execjs (1.4.0) + multi_json (~> 1.0) + faraday (0.8.1) + multipart-post (~> 1.1) + ffaker (1.15.0) fog (1.4.0) builder excon (~> 0.14.0) @@ -57,7 +122,9 @@ GEM nokogiri (~> 1.5.0) ruby-hmac formatador (0.2.3) + hashie (1.2.0) hike (1.2.1) + httpauth (0.1) i18n (0.6.0) journey (1.0.4) jquery-rails (2.0.2) @@ -67,6 +134,15 @@ GEM jquery-rails railties (>= 3.1.0) json (1.7.3) + jwt (0.1.5) + multi_json (>= 1.0) + less (2.2.1) + commonjs (~> 0.2.6) + less-rails (2.2.3) + actionpack (>= 3.1) + less (~> 2.2.0) + libv8 (3.3.10.4) + machinist (2.0) mail (2.4.4) i18n (>= 0.4.0) mime-types (~> 1.16) @@ -76,15 +152,48 @@ GEM mini_magick (3.4) subexec (~> 0.2.1) multi_json (1.3.6) + multipart-post (1.1.5) net-scp (1.0.4) net-ssh (>= 1.99.1) net-ssh (2.5.2) nokogiri (1.5.5) + oauth (0.4.6) + oauth2 (0.8.0) + faraday (~> 0.8) + httpauth (~> 0.1) + jwt (~> 0.1.4) + multi_json (~> 1.0) + rack (~> 1.2) + omniauth (1.1.0) + hashie (~> 1.2) + rack + omniauth-facebook (1.4.1) + omniauth-oauth2 (~> 1.1.0) + omniauth-google-apps (0.0.2) + omniauth (~> 1.0) + omniauth-openid (~> 1.0) + ruby-openid-apps-discovery (~> 1.2.0) + omniauth-oauth (1.0.1) + oauth + omniauth (~> 1.0) + omniauth-oauth2 (1.1.0) + oauth2 (~> 0.8.0) + omniauth (~> 1.0) + omniauth-openid (1.0.1) + omniauth (~> 1.0) + rack-openid (~> 1.3.1) + omniauth-twitter (0.0.12) + multi_json (~> 1.3) + omniauth-oauth (~> 1.0) + orm_adapter (0.4.0) polyglot (0.3.3) princely (1.2.5) rack (1.4.1) rack-cache (1.2) rack (>= 0.4) + rack-openid (1.3.1) + rack (>= 1.1.0) + ruby-openid (>= 2.1.8) rack-ssl (1.3.2) rack rack-test (0.6.1) @@ -108,35 +217,65 @@ GEM rdoc (3.12) json (~> 1.4) ruby-hmac (0.4.0) + ruby-openid (2.2.0) + ruby-openid-apps-discovery (1.2.0) + ruby-openid (>= 2.1.7) + sass (3.1.20) + sass-rails (3.2.5) + railties (~> 3.2.0) + sass (>= 3.1.10) + tilt (~> 1.3) sprockets (2.1.3) hike (~> 1.2) rack (~> 1.0) tilt (~> 1.1, != 1.3.0) sqlite3 (1.3.6) - sqlite3-ruby (1.3.3) - sqlite3 (>= 1.3.3) subexec (0.2.2) + therubyracer (0.10.1) + libv8 (~> 3.3.10) thor (0.15.4) tilt (1.3.3) treetop (1.4.10) polyglot polyglot (>= 0.3.1) tzinfo (0.3.33) + uglifier (1.2.6) + execjs (>= 0.3.0) + multi_json (~> 1.3) + warden (1.2.1) + rack (>= 1.0) + yamler (0.1.0) + yettings (0.1.1) PLATFORMS ruby DEPENDENCIES - authlogic + cancan carrierwave (= 0.6.2) + coffee-rails + configatron! + devise_omniauth_engine! dynamic_form + ffaker fog jquery-rails jquery-ui-rails + machinist mime-types mini_exiftool mini_magick + omniauth-facebook + omniauth-google-apps + omniauth-openid + omniauth-twitter + omniauth-vkontakte! + plupload-rails! princely rails (= 3.2.6) russian! - sqlite3-ruby + sass-rails + sequel! + sqlite3 + twitter-bootstrap-rails! + uglifier diff --git a/Rakefile b/Rakefile index 34cf696..2465485 100644 --- a/Rakefile +++ b/Rakefile @@ -4,4 +4,4 @@ require File.expand_path('../config/application', __FILE__) require 'rake' -Balder::Application.load_tasks +Photomix::Application.load_tasks diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js new file mode 100644 index 0000000..87ab0a9 --- /dev/null +++ b/app/assets/javascripts/application.js @@ -0,0 +1,18 @@ +// This is a manifest file that'll be compiled into including all the files listed below. +// Add new JavaScript/Coffee code in separate files in this directory and they'll automatically +// be included in the compiled file accessible from http://example.com/assets/application.js +// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the +// the compiled file. +// +//= require jquery +//= require jquery_ujs +//= require twitter/bootstrap +//= require plupload +//= require jquery.plupload.queue +//= require plupload.flash +//= require plupload.silverlight +//= require plupload.html4 +//= require plupload.html5 +//= require plupload.gears +//= require plupload.browserplus +//= require_tree . diff --git a/app/assets/javascripts/bootstrap.js.coffee b/app/assets/javascripts/bootstrap.js.coffee new file mode 100644 index 0000000..c9404a8 --- /dev/null +++ b/app/assets/javascripts/bootstrap.js.coffee @@ -0,0 +1,4 @@ +jQuery -> + $("a[rel=popover]").popover() + $(".tooltip").tooltip() + $("a[rel=tooltip]").tooltip() \ No newline at end of file diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index bee6c61..424cc96 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -1,248 +1,6 @@ -/* @override - http://localhost:3000/stylesheets/application.css - http://photos.inspired.no/stylesheets/application.css?1316927557 -*/ - -/* @group Reset */ - -html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td {margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline;} -body {line-height:1.5;} -table {border-collapse:separate;border-spacing:0;} -caption, th, td {text-align:left;font-weight:normal;} -table, td, th {vertical-align:middle;} -blockquote:before, blockquote:after, q:before, q:after {content:"";} -blockquote, q {quotes:"" "";} -a img {border:none;} - - - -/* @end */ - -/* @group Typography */ - -body {font-size:75%;color:#222;background:#fff;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;} -h1, h2, h3, h4, h5, h6 {font-weight:normal;} -h1 {font-size:3em;line-height:1;margin-bottom:0.5em;} -h2 {font-size:2em;margin-bottom:0.75em;} -h3 {font-size:1.5em;line-height:1;margin-bottom:1em;} -h4 {font-size:1.2em;line-height:1.25;margin-bottom:1.25em;} -h5 {font-size:1em;font-weight:bold;margin-bottom:1.5em;} -h6 {font-size:1em;font-weight:bold;} -h1 img, h2 img, h3 img, h4 img, h5 img, h6 img {margin:0;} -p {margin:0 0 1.5em;} -p img.left {float:left;margin:1.5em 1.5em 1.5em 0;padding:0;} -p img.right {float:right;margin:1.5em 0 1.5em 1.5em;} -a:focus, a:hover {color:#000;} -a {color:#009;text-decoration:underline;} -blockquote {margin:1.5em;color:#666;font-style:italic;} -strong {font-weight:bold;} -em, dfn {font-style:italic;} -dfn {font-weight:bold;} -sup, sub {line-height:0;} -abbr, acronym {border-bottom:1px dotted #666;} -address {margin:0 0 1.5em;font-style:italic;} -del {color:#666;} -pre {margin:1.5em 0;white-space:pre;} -pre, code, tt {font:1em 'andale mono', 'lucida console', monospace;line-height:1.5;} -li ul, li ol {margin:0 1.5em;} -ul, ol {margin:0 1.5em 1.5em 1.5em;} -ul {list-style-type:disc;} -ol {list-style-type:decimal;} -dl {margin:0 0 1.5em 0;} -dl dt {font-weight:bold;} -dd {margin-left:1.5em;} -table {margin-bottom:1.4em;width:100%;} -th {font-weight:bold;} -thead th {background:#c3d9ff;} -th, td, caption {padding:4px 10px 4px 5px;} -tr.even td {background:#e5ecf9;} -tfoot {font-style:italic;} -caption {background:#eee;} -.small {font-size:.8em;margin-bottom:1.875em;line-height:1.875em;} -.large {font-size:1.2em;line-height:2.5em;margin-bottom:1.25em;} -.hide {display:none;} -.quiet {color:#666;} -.loud {color:#000;} -.highlight {background:#ff0;} -.added {background:#060;color:#fff;} -.removed {background:#900;color:#fff;} -.first {margin-left:0;padding-left:0;} -.last {margin-right:0;padding-right:0;} -.top {margin-top:0;padding-top:0;} -.bottom {margin-bottom:0;padding-bottom:0;} -.clear { - clear: both; -} - - - -/* @end */ - -#container { - width: 950px; - margin: 0 auto; -} - -div#header h1 { - text-transform: uppercase; - font-weight: bold; - letter-spacing: 10px; - margin: 10px 0 0 0; - float: left; - clear: left; -} - -div#header h1 a, div#header h1 a:visited, div#header h1 a:active, div#header h1 a:hover { - text-decoration: none; - color: #222; -} - -div#header { - padding: 10px 0; -} -div#content { - clear: both; -} -div#footer { - clear: both; -} -form#search { - margin: 5px 0; - padding: 5px 10px; - float: right; -} -form#search input { - padding: 5px 5px 5px; - font-size: 13px; -} -form#search input.textfield { - width: 400px; - border: 1px solid black; -} -p.links { - margin: 5px 0; - text-transform: uppercase; -} -p.links a { - text-decoration: none; -} -p.links a:hover { - text-decoration: underline; -} -hr.seperator { - clear: both; - border: none; - background-color: #ddd; - height: 1px; -} -div.thumb { - background-color: #eee; - float: left; - padding: 10px; - margin-right: 10px; - margin-bottom: 10px; -} -div.thumb h3 { - text-transform: uppercase; - font-weight: bold; - font-size: 13px; -} -div.thumb h3 a { - color: black; - text-decoration: none; -} -div.thumb h3 a:hover { - border-bottom: 1px solid #999;} -div.thumb img { - width: 200px; - height: 200px; -} -div.thumb p { - text-align: center; - margin: 0; -} -.row { - clear: both; - padding-bottom: 40px; -} - -img { - - -} -.row div.image { - margin: 10px 0 0; - float: left; -} -.row div.image img { - margin: 0 0 0 10px; -} -div.title { - margin: 10px 0 0; - border-right: 1px solid #bbb; - display: block; - float: left; - width: 240px; -} -.row div.title img, .row div.image img { - width: 100px; - height: 100px; -} -div.title img { - float: right; - padding-right: 10px; - width: 100px; -} -div.title p { - font-weight: bold; - font-size: 18px; -} -div#header h1 p { - display: inline; - font-size: 12px; - letter-spacing: normal; - font-weight: normal; -} - -DIV#map_canvas { - width: 500px; - height: 300px; - float:right; - border:4px solid black; - display: none; -} - -DIV#breadcrumb { - float: left; -} - -DIV#action_links { - float: right; - clear: right; -} - -td { - vertical-align: bottom; -} -p#notice { - color: green; -} - -DIV#collection_albums { - width: 710px; - clear: both; -} -DIV#collection_albums span { - position: relative; - display: block; - float: left; - padding: 5px; -} -DIV#collection_albums IMG.delete { - display: block; - vertical-align: top; - position: absolute; - cursor: pointer; - right: 8px; - top: 8px; -} \ No newline at end of file +/* + *= require_self + *= require_tree . + *= require jquery.plupload.queue + *= require bootstrap_and_overrides + */ \ No newline at end of file diff --git a/app/assets/stylesheets/bootstrap_and_overrides.css.less b/app/assets/stylesheets/bootstrap_and_overrides.css.less new file mode 100644 index 0000000..14bf301 --- /dev/null +++ b/app/assets/stylesheets/bootstrap_and_overrides.css.less @@ -0,0 +1,32 @@ +@import "twitter/bootstrap/bootstrap"; +body { + padding-top: 60px; +} + +@import "twitter/bootstrap/responsive"; + +// Set the correct sprite paths +@iconSpritePath: asset-path('twitter/bootstrap/glyphicons-halflings.png'); +@iconWhiteSpritePath: asset-path('twitter/bootstrap/glyphicons-halflings-white.png'); + +// Set the Font Awesome (Font Awesome is default. You can disable by commenting below lines) +// Note: If you use asset_path() here, your compiled boostrap_and_overrides.css will not +// have the proper paths. So for now we use the absolute path. +@fontAwesomeEotPath: '/assets/fontawesome-webfont.eot'; +@fontAwesomeWoffPath: '/assets/fontawesome-webfont.woff'; +@fontAwesomeTtfPath: '/assets/fontawesome-webfont.ttf'; +@fontAwesomeSvgPath: '/assets/fontawesome-webfont.svg'; + +// Font Awesome +@import "fontawesome"; + +// Your custom LESS stylesheets goes here +// +// Since bootstrap was imported above you have access to its mixins which +// you may use and inherit here +// +// If you'd like to override bootstrap's own variables, you can do so here as well +// See http://twitter.github.com/bootstrap/less.html for their names and documentation +// +// Example: +// @linkColor: #ff0000; diff --git a/vendor/assets/javascripts/plupload/js/jquery.plupload.queue/css/jquery.plupload.queue.css b/app/assets/stylesheets/jquery.plupload.queue.scss similarity index 79% rename from vendor/assets/javascripts/plupload/js/jquery.plupload.queue/css/jquery.plupload.queue.css rename to app/assets/stylesheets/jquery.plupload.queue.scss index 8581fdd..8c7093c 100644 --- a/vendor/assets/javascripts/plupload/js/jquery.plupload.queue/css/jquery.plupload.queue.css +++ b/app/assets/stylesheets/jquery.plupload.queue.scss @@ -11,7 +11,7 @@ border: 1px solid #bababa; padding: 2px 8px 3px 20px; margin-right: 4px; - background: #f3f3f3 url('../img/buttons.png') no-repeat 0 center; + background: #f3f3f3 url(asset_path("buttons.png")) no-repeat 0 center; outline: 0; /* Optional rounded corners for browsers that support it */ @@ -29,7 +29,7 @@ .plupload_disabled, a.plupload_disabled:hover { color: #737373; border-color: #c5c5c5; - background: #ededed url('../img/buttons-disabled.png') no-repeat 0 center; + background: #ededed url(asset_path('buttons-disabled.png')) no-repeat 0 center; cursor: default; } @@ -44,7 +44,7 @@ .plupload_container { padding: 8px; - background: url('../img/transp50.png'); + background: url(asset_path('transp50.png')); /*-moz-border-radius: 5px;*/ } @@ -54,9 +54,9 @@ width: 98%; } -.plupload_header {background: #2A2C2E url('../img/backgrounds.gif') repeat-x;} +.plupload_header {background: #2A2C2E url(asset_path('backgrounds.gif')) repeat-x;} .plupload_header_content { - background: url('../img/backgrounds.gif') no-repeat 0 -317px; + background: url(asset_path('backgrounds.gif')) no-repeat 0 -317px; min-height: 56px; padding-left: 60px; color: #FFF; @@ -83,7 +83,7 @@ .plupload_filelist li { padding: 10px 8px; - background: #F5F5F5 url('../img/backgrounds.gif') repeat-x 0 -156px; + background: #F5F5F5 url(asset_path('backgrounds.gif')) repeat-x 0 -156px; border-bottom: 1px solid #DDD; } @@ -122,20 +122,20 @@ height: 16px; } -li.plupload_uploading {background: #ECF3DC url('../img/backgrounds.gif') repeat-x 0 -238px;} +li.plupload_uploading {background: #ECF3DC url(asset_path('backgrounds.gif')) repeat-x 0 -238px;} li.plupload_done {color:#AAA} li.plupload_delete a { - background: url('../img/delete.gif'); + background: url(asset_path('delete.gif')); } li.plupload_failed a { - background: url('../img/error.gif'); + background: url(asset_path('error.gif')); cursor: default; } li.plupload_done a { - background: url('../img/done.gif'); + background: url(asset_path('done.gif')); cursor: default; } diff --git a/vendor/assets/javascripts/plupload/js/jquery.ui.plupload/css/jquery.ui.plupload.css b/app/assets/stylesheets/jquery.ui.plupload.scss similarity index 90% rename from vendor/assets/javascripts/plupload/js/jquery.ui.plupload/css/jquery.ui.plupload.css rename to app/assets/stylesheets/jquery.ui.plupload.scss index a819fff..2aa9dd3 100644 --- a/vendor/assets/javascripts/plupload/js/jquery.ui.plupload/css/jquery.ui.plupload.css +++ b/app/assets/stylesheets/jquery.ui.plupload.scss @@ -20,14 +20,14 @@ div.plupload div.plupload_header {border-width: 0 0 1px 0; position: relative;} } .plupload_header_content { - background-image: url('../img/plupload.png'); + background-image: url(asset_path('plupload.png')); background-repeat: no-repeat; background-position: 8px center; min-height: 56px; padding-left: 60px; position:relative; } -.plupload_header_content_bw {background-image: url('../img/plupload-bw.png');} +.plupload_header_content_bw {background-image: url(asset_path('plupload-bw.png'));} .plupload_header_title { font: normal 18px sans-serif; padding: 6px 0 3px; @@ -61,7 +61,6 @@ div.plupload div.plupload_header {border-width: 0 0 1px 0; position: relative;} max-height: 180px; min-height: 168px; _height: 168px; - overflow-y: auto; } .plupload_file_size, .plupload_file_status {text-align: right;} diff --git a/app/controllers/admin/application_controller.rb b/app/controllers/admin/application_controller.rb deleted file mode 100644 index 99a9d86..0000000 --- a/app/controllers/admin/application_controller.rb +++ /dev/null @@ -1,5 +0,0 @@ -class Admin::ApplicationController < ApplicationController - - before_filter :require_role_admin - -end diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb deleted file mode 100644 index 9ca0051..0000000 --- a/app/controllers/admin/users_controller.rb +++ /dev/null @@ -1,47 +0,0 @@ -class Admin::UsersController < Admin::ApplicationController - - def index - @users = User.find(:all, :order => "Name, email") - end - - def show - @user = User.find(params[:id]) - end - - def new - @user = User.new - end - - def create - @user = User.new(params[:user]) - if @user.save - flash[:notice] = "Account registered!" - redirect_to @user - else - render :action => :new - end - end - - def edit - @user = User.find(params[:id]) - end - - def update - @user = User.find(params[:id]) - if @user.update_attributes(params[:user]) - flash[:notice] = "Account updated!" - redirect_to @user - else - render :action => :edit - end - end - - def destroy - @user = User.find(params[:id]) - if @user.destroy - redirect_to users_path - else - redirect_to @user - end - end -end diff --git a/app/controllers/albums_controller.rb b/app/controllers/albums_controller.rb index 7cfda39..831c8c8 100644 --- a/app/controllers/albums_controller.rb +++ b/app/controllers/albums_controller.rb @@ -1,10 +1,10 @@ class AlbumsController < ApplicationController before_filter :check_public_access - before_filter :require_role_admin, :only => [:untouched, :new, :create, :edit, :update, :destroy] + skip_before_filter :authenticate_user!, :only => [:index, :show] def index if params[:tag_id] - @albums = Album.find(:all, :conditions => [ "id IN ( SELECT DISTINCT photos.album_id FROM photos WHERE photos.id IN ( SELECT photo_id FROM photo_tags WHERE photo_tags.tag_id = :q) )", { :q => Tag.find( params[:tag_id] ).id } ], :order => 'title') + @albums = Album.where(:conditions => [ "id IN ( SELECT DISTINCT photos.album_id FROM photos WHERE photos.id IN ( SELECT photo_id FROM photo_tags WHERE photo_tags.tag_id = :q) )", { :q => Tag.find( params[:tag_id] ).id } ]).order('title') elsif params[:q] #search = params[:q] #search = search.split("AND").map{|q|q.strip} @@ -20,7 +20,7 @@ class AlbumsController < ApplicationController end } else - @albums = Album.find(:all, :order => 'title') + @albums = Album.order('albums.title') end respond_to do |format| format.html diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 46867fc..fd82122 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -2,86 +2,33 @@ # Likewise, all the methods added will be available for all controllers. class ApplicationController < ActionController::Base + layout 'bootstrap' helper :all # include all helpers, all the time protect_from_forgery # See ActionController::RequestForgeryProtection for details - helper_method :current_user, :current_user_session - + before_filter :authenticate_user!, :set_current_user before_filter :setup - private - - def setup - redirect_to new_account_path if User.all.length == 0 - end - - def check_public_access - require_user if ENV['PRIVATE'] == 'true' - end + # This hack is needed to access the current user in models. See http://rails-bestpractices.com/posts/47-fetch-current-user-in-models + def set_current_user + User.current = current_user + end - def current_user_session - return @current_user_session if defined?(@current_user_session) - @current_user_session = UserSession.find - end + def setup + redirect_to new_account_path if User.all.size == 0 + end - def current_user - return @current_user if defined?(@current_user) - @current_user = current_user_session && current_user_session.user - end + def check_public_access + require_user if ENV['PRIVATE'] == 'true' + end - def require_role(roles = []) - unless current_user && current_user.in_role?(*roles) - store_location - flash[:notice] = "You must have permission to access this page" - redirect_to account_path - return false - end - return true - end + def store_location + session[:return_to] = request.fullpath + end - def require_role_admin - return false if !require_user - return require_role("admin") - end - - def require_permission(permissions = []) - return false if !require_user - unless current_user && current_user.has_permission?(*permissions) - store_location - flash[:notice] = "You must have permission to access this page" - redirect_to account_path - return false - end - return true - end - - def require_user - unless current_user - store_location - flash[:notice] = "You must be logged in to access this page" - redirect_to login_path - return false - end - return true - end - - def require_no_user - if current_user - store_location - flash[:notice] = "Already logged in. Please logout" - redirect_to account_path - return false - end - return true - end - - def store_location - session[:return_to] = request.fullpath - end - - def redirect_back_or_default(default) - redirect_to(session[:return_to] || default) - session[:return_to] = nil - end + def redirect_back_or_default(default) + redirect_to(session[:return_to] || default) + session[:return_to] = nil + end end diff --git a/app/controllers/collections_controller.rb b/app/controllers/collections_controller.rb index bd67f8e..18d300e 100644 --- a/app/controllers/collections_controller.rb +++ b/app/controllers/collections_controller.rb @@ -1,9 +1,10 @@ class CollectionsController < ApplicationController before_filter :check_public_access - before_filter :require_role_admin, :only => [:new, :create, :edit, :update, :destroy] + skip_before_filter :authenticate_user!, :only => [:index, :show] + def index - @collections = Collection.find(:all, :order => 'title') + @collections = Collection.joins(:albums => :photos).group_for.order('collections.title') respond_to do |format| format.html format.json { render :json => @collections } @@ -13,7 +14,7 @@ class CollectionsController < ApplicationController def show @collection = Collection.find( params[:id] ) - @albums = @collection.albums.find(:all, :order => 'title') + @albums = @collection.albums.order('title') respond_to do |format| format.html format.json { render :json => @collection } diff --git a/app/controllers/locale_controller.rb b/app/controllers/locale_controller.rb new file mode 100644 index 0000000..60bfc78 --- /dev/null +++ b/app/controllers/locale_controller.rb @@ -0,0 +1,14 @@ +class LocaleController < ApplicationController + def set + if request.referer && request.referer.starts_with?('http://' + request.host) + session['return_to'] = request.referer + end + if params[:locale] && I18n.available_locales.include?(params[:locale].to_sym) + session[:locale] = I18n.locale = params[:locale].to_sym + flash.notice = t(:locale_changed) + else + flash[:error] = t(:locale_not_changed) + end + redirect_back_or_default(root_path) + end +end diff --git a/app/controllers/photos_controller.rb b/app/controllers/photos_controller.rb index 909d157..ad698d7 100644 --- a/app/controllers/photos_controller.rb +++ b/app/controllers/photos_controller.rb @@ -1,17 +1,17 @@ class PhotosController < ApplicationController before_filter :check_public_access - before_filter :require_role_admin, :only => [:untouched, :upload, :new, :create, :edit, :update, :destroy, :scan] + skip_before_filter :authenticate_user!, :only => [:index, :show] def index if params[:tag_id] && params[:album_id] @tag = Tag.find_by_title!( params[:tag_id] ) - @photos = @tag.photos.find(:all, :conditions => ['photos.album_id = :album', {:album => Album.find(params[:album_id] ) } ], :order => "photos.id ASC") + @photos = @tag.photos.where(:conditions => ['photos.album_id = :album', {:album => Album.find(params[:album_id] ) } ]).order("photos.id ASC") elsif params[:tag_id] @tag = Tag.find_by_title!( params[:tag_id] ) - @photos = @tag.photos.find(:all, :order => "photos.id ASC") + @photos = @tag.photos.order("photos.id ASC") elsif params[:album_id] @album = Album.find( params[:album_id]) - @photos = @album.photos.find(:all, :order => "photos.id ASC") + @photos = @album.photos.order("photos.id ASC") elsif params[:q] #search = params[:q] #search = search.split("AND").map{|q|q.strip} @@ -25,7 +25,7 @@ class PhotosController < ApplicationController end } else - @photos = Photo.find(:all, :order => "photos.id ASC") + @photos = Photo.order("photos.id ASC") end respond_to do |format| format.html @@ -77,10 +77,10 @@ class PhotosController < ApplicationController def create @photo = Photo.new(params[:photo]) - @photo.file = params[:file] + @photo.attachment = params[:file] respond_to do |format| if @photo.save - format.html { render :text => "FILEID:" + @photo.file.album.url } + format.html { render :text => "FILEID:" + @photo.attachment.album.url } format.xml { render :nothing => true } else format.html { render :text => "ERRORS:" + @photo.errors.full_messages.join(" "), :status => 500 } @@ -91,7 +91,7 @@ class PhotosController < ApplicationController def edit @photo = Photo.find( params[:id]) - @tags = Tag.find(:all).map { |tag| tag.title }.join('\',\'') + @tags = Tag.all.map { |tag| tag.title }.join('\',\'') end def edit_multiple diff --git a/app/controllers/user_sessions_controller.rb b/app/controllers/user_sessions_controller.rb deleted file mode 100644 index acc3e57..0000000 --- a/app/controllers/user_sessions_controller.rb +++ /dev/null @@ -1,24 +0,0 @@ -class UserSessionsController < ApplicationController - before_filter :require_no_user, :only => [:new, :create] - before_filter :require_user, :only => :destroy - - def new - @user_session = UserSession.new - end - - def create - @user_session = UserSession.new(params[:user_session]) - if @user_session.save - flash[:notice] = "Login successful!" - redirect_back_or_default account_path - else - render :new - end - end - - def destroy - current_user_session.destroy - flash[:notice] = "Logout successful!" - redirect_to root_path - end -end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index a7cb18d..8843607 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,7 +1,6 @@ class UsersController < ApplicationController before_filter :check_public_access - before_filter :require_no_user, :only => [:new, :create] - before_filter :require_user, :only => [:show, :edit, :update, :destroy] + skip_before_filter :authenticate_user!, :only => [:new, :create] skip_filter :setup def new diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb index 1062f12..44e7820 100644 --- a/app/helpers/users_helper.rb +++ b/app/helpers/users_helper.rb @@ -1,9 +1,3 @@ module UsersHelper - def has_permission?(permissions = []) - return current_user && current_user.has_permission?(permissions) - end - - def has_role?(roles = []) - return current_user && current_user.in_role?(roles) - end + end diff --git a/app/models/ability.rb b/app/models/ability.rb new file mode 100644 index 0000000..1064327 --- /dev/null +++ b/app/models/ability.rb @@ -0,0 +1,63 @@ +class Ability + include CanCan::Ability + + def initialize(user) + self.clear_aliased_actions + + alias_action :edit, :to => :update + alias_action :new, :to => :create + alias_action :new_action, :to => :create + alias_action :show, :to => :read + + if user.has_role? 'admin' + can :manage, :all + else + ############################# + can :read, User do |resource| + resource == user + end + can :update, User do |resource| + resource == user + end + can :create, User + ############################## + can :read, Profile do |resource| + resource == user + end + can :update, Profile do |resource| + resource == user + end + can :create, Profile + ############################### + can :read, Link do |resource| + resource == user + end + can :update, Link do |resource| + resource == user + end + can :create, Link + end + # Define abilities for the passed in user here. For example: + # + # user ||= User.new # guest user (not logged in) + # if user.admin? + # can :manage, :all + # else + # can :read, :all + # end + # + # The first argument to `can` is the action you are giving the user permission to do. + # If you pass :manage it will apply to every action. Other common actions here are + # :read, :create, :update and :destroy. + # + # The second argument is the resource the user can perform the action on. If you pass + # :all it will apply to every resource. Otherwise pass a Ruby class of the resource. + # + # The third argument is an optional hash of conditions to further filter the objects. + # For example, here the user can only update published articles. + # + # can :update, Article, :published => true + # + # See the wiki for details: https://github.com/ryanb/cancan/wiki/Defining-Abilities + end +end diff --git a/app/models/album.rb b/app/models/album.rb index d88c06c..3f0728f 100644 --- a/app/models/album.rb +++ b/app/models/album.rb @@ -1,4 +1,6 @@ class Album < ActiveRecord::Base + extend Ext::GroupFor + has_many :photos, :dependent => :destroy has_many :collection_albums has_many :collections, :through => :collection_albums @@ -12,7 +14,7 @@ class Album < ActiveRecord::Base attr_accessor :tags #attr_protected :path - + scope :untouched, where("albums.id IN ( SELECT DISTINCT photos.album_id FROM photos WHERE photos.description IS NULL AND photos.id NOT IN ( SELECT photo_id FROM photo_tags) )").order('title') scope :unused, where("albums.id NOT IN (SELECT album_id FROM collection_albums)") scope :used, where("albums.id IN (SELECT album_id FROM collection_albums)") diff --git a/app/models/collection.rb b/app/models/collection.rb index 926a7f7..666248f 100644 --- a/app/models/collection.rb +++ b/app/models/collection.rb @@ -1,10 +1,13 @@ class Collection < ActiveRecord::Base + extend Ext::GroupFor + has_many :collection_albums has_many :albums, :through => :collection_albums attr_accessor :album_list validates :title, :presence => true + def to_param "#{id}-#{title.parameterize}" end diff --git a/app/models/permission.rb b/app/models/permission.rb deleted file mode 100644 index c2951ff..0000000 --- a/app/models/permission.rb +++ /dev/null @@ -1,19 +0,0 @@ -class Permission < ActiveRecord::Base - # uncomment any of the following lines which is relevant to your application, - # or create your own with the name of the model which acts_as_permissible. - belongs_to :user - - belongs_to :role - - belongs_to :permissible, :polymorphic => true, :dependent => :destroy - - validates_presence_of :permissible_id, :permissible_type, :action - validates_format_of :action, :with => /^[a-z_]+$/ - validates_numericality_of :permissible_id - validates_uniqueness_of :action, :scope => [:permissible_id,:permissible_type] - - def to_hash - self.new_record? ? {} : {self.action => self.granted} - end - -end \ No newline at end of file diff --git a/app/models/photo.rb b/app/models/photo.rb index 652fb6d..552ab39 100644 --- a/app/models/photo.rb +++ b/app/models/photo.rb @@ -1,17 +1,16 @@ class Photo < ActiveRecord::Base - # TODO: path not used? it should be removed from the DB + extend Ext::GroupFor belongs_to :album has_many :photo_tags, :dependent => :destroy has_many :tags, :through => :photo_tags - mount_uploader :file, FileUploader + mount_uploader :attachment, FileUploader - validates :title, :presence => true - - before_validation :set_title + before_create :exif_read - #before_update :exif_write + before_update :exif_write + after_create :set_title attr_accessor :tag_list @@ -39,7 +38,7 @@ class Photo < ActiveRecord::Base end def tag_list - return self.tags.find(:all, :order => 'title').map{ |t| t.title }.sort.join(" ") + return self.tags.order('title').map{ |t| t.title }.sort.join(" ") end def tag_list=(tags) @@ -58,11 +57,13 @@ class Photo < ActiveRecord::Base private def set_title - self.title = self.file.file.basename.titleize unless self.title + a=self.attachment.file.basename + update_attribute(:title, a.titleize) + self.title = self.attachment.file.basename.titleize unless self.title end def exif_read - photo = MiniExiftool.new(self.file.file.file) + photo = MiniExiftool.new(self.attachment.file.file) self.longitude = photo.GPSLongitude if self.longitude.nil? self.latitude = photo.GPSLatitude if self.latitude.nil? self.title = photo.DocumentName if self.title.nil? @@ -72,7 +73,7 @@ class Photo < ActiveRecord::Base def exif_write # should only write if tags are changed as images can be large and thus ExifTool will take a while to write to the file - photo = MiniExiftool.new(self.file.file.file) + photo = MiniExiftool.new(self.attachment.file.file) photo.GPSLongitude = self.longitude photo.GPSLatitude = self.latitude photo.DocumentName = self.title diff --git a/app/models/role.rb b/app/models/role.rb index 8fbb325..a213fdf 100644 --- a/app/models/role.rb +++ b/app/models/role.rb @@ -1,12 +1,5 @@ class Role < ActiveRecord::Base - has_many :role_memberships, :as => :roleable, :dependent => :destroy - has_many :roles, :through => :role_memberships, :source => :role - - has_many :roleables, :class_name => "RoleMembership", :foreign_key => "role_id", :dependent => :destroy - has_many :subroles, :through => :roleables, :source => :roleable, :source_type => 'Role' - has_many :users, :through => :roleables, :source => :roleable, :source_type => 'User' - - validates :name, :presence => true, :uniqueness => true - - acts_as_permissible -end \ No newline at end of file + attr_accessible :name + + has_and_belongs_to_many :users +end diff --git a/app/models/role_membership.rb b/app/models/role_membership.rb deleted file mode 100644 index 9ebcbe2..0000000 --- a/app/models/role_membership.rb +++ /dev/null @@ -1,36 +0,0 @@ -class RoleMembership < ActiveRecord::Base - belongs_to :user - belongs_to :role - belongs_to :roleable, :polymorphic => true - - validates_presence_of :roleable_id, :roleable_type, :role_id - validates_uniqueness_of :role_id, :scope => [:roleable_id, :roleable_type] - validates_numericality_of :roleable_id, :role_id - validates_format_of :roleable_type, :with => /^[A-Z]{1}[a-z0-9]+([A-Z]{1}[a-z0-9]+)*$/ - validate :role_does_not_belong_to_itself_in_a_loop - - protected - def role_does_not_belong_to_itself_in_a_loop - if roleable_type == "Role" - if role_id == roleable_id - errors.add_to_base("A role cannot belong to itself.") - else - if belongs_to_itself_through_other?(roleable_id, role_id) - errors.add_to_base("A role cannot belong to a role which belongs to it.") - end - end - end - end - - def belongs_to_itself_through_other?(original_roleable_id, current_role_id) - if self.class.find(:first, :select => "id", :conditions => ["roleable_id=? AND roleable_type='Role' AND role_id=?",current_role_id,original_roleable_id]) - return true - else - memberships = self.class.find(:all, :select => "role_id", :conditions => ["roleable_id=? AND roleable_type='Role'",current_role_id]) - if memberships.any? {|membership| belongs_to_itself_through_other?(original_roleable_id,membership.role_id)} - return true - end - end - return false - end -end \ No newline at end of file diff --git a/app/models/user.rb b/app/models/user.rb index d1d3345..780cc4e 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,4 +1,43 @@ class User < ActiveRecord::Base - acts_as_authentic - acts_as_permissible + devise :database_authenticatable, :registerable, :confirmable, :token_authenticatable, + :recoverable, :rememberable, :trackable, :validatable, :omniauthable, :lockable + + attr_accessible :id, :name, :second_name, :surname, :email, :password, :password_confirmation, :remember_me, :userpic + + mount_uploader :userpic, UserpicUploader + + has_and_belongs_to_many :roles + + def small_url + userpic.url(:small) + end + + alias_method :avatar, :small_url + + def thumb_url + userpic.url(:thumb) + end + + def original_url + userpic.url(:original) + end + + ########################################################## + # This hack is needed to access the current user in models. + #See http://rails-bestpractices.com/posts/47-fetch-current-user-in-models + def self.current + Thread.current[:user] + end + + def self.current=(user) + Thread.current[:user] = user + end + + def self.admin_created? + User.admin.count > 0 + end + + def has_role?(role_in_question) + roles.any? { |role| role.name == role_in_question.to_s } + end end diff --git a/app/models/user_session.rb b/app/models/user_session.rb deleted file mode 100644 index ec55ada..0000000 --- a/app/models/user_session.rb +++ /dev/null @@ -1,6 +0,0 @@ -class UserSession < Authlogic::Session::Base - # configuration here, see documentation for sub modules of Authlogic::Session - def to_key - new_record? ? nil : [ self.send(self.class.primary_key) ] - end -end diff --git a/app/uploaders/file_uploader.rb b/app/uploaders/file_uploader.rb index f429525..e38b330 100644 --- a/app/uploaders/file_uploader.rb +++ b/app/uploaders/file_uploader.rb @@ -2,6 +2,9 @@ class FileUploader < CarrierWave::Uploader::Base + @@generate_file_name = '' + @@original_filename = '' + # Include RMagick or ImageScience support # include CarrierWave::RMagick # include CarrierWave::ImageScience @@ -21,7 +24,15 @@ class FileUploader < CarrierWave::Uploader::Base # This is a sensible default for uploaders that are meant to be mounted: def store_dir #{}"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" - ENV['STORAGE_PATH'] + "/files/#{model.album.path}" + ENV['STORAGE_PATH'] + "/files/#{model.album.path}/#{model.id}" + end + + def filename + unless @@original_filename == original_filename + @@original_filename = original_filename + @@generate_file_name = "#{::SecureRandom.hex(8)}#{File.extname(original_filename).downcase}" if original_filename + end + @@generate_file_name end # Provide a default URL as a default if there hasn't been a file uploaded @@ -38,31 +49,34 @@ class FileUploader < CarrierWave::Uploader::Base # Create different versions of your uploaded files version :collection do - process :resize_to_fill => [200, 200] + process :resize_to_fill => [260, 180] def store_dir - ENV['STORAGE_PATH'] + "/thumbs/#{model.album.path}" + ENV['STORAGE_PATH'] + "/thumbs/#{model.album.path}/#{model.id}" end end + version :album do process :resize_to_fill => [100, 100] def store_dir - ENV['STORAGE_PATH'] + "/thumbs/#{model.album.path}" + ENV['STORAGE_PATH'] + "/thumbs/#{model.album.path}/#{model.id}" end end + version :preview do process :resize_to_fit => [210, 210] def store_dir - ENV['STORAGE_PATH'] + "/thumbs/#{model.album.path}" + ENV['STORAGE_PATH'] + "/thumbs/#{model.album.path}/#{model.id}" end end + version :single do process :resize_to_limit => [950, 950] def store_dir - ENV['STORAGE_PATH'] + "/thumbs/#{model.album.path}" + ENV['STORAGE_PATH'] + "/thumbs/#{model.album.path}/#{model.id}" end end @@ -71,10 +85,4 @@ class FileUploader < CarrierWave::Uploader::Base def extension_white_list %w(jpg jpeg gif png bmp tiff) end - - # Override the filename of the uploaded files - # def filename - # "something.jpg" if original_filename - # end - end diff --git a/app/uploaders/userpic_uploader.rb b/app/uploaders/userpic_uploader.rb new file mode 100644 index 0000000..888b822 --- /dev/null +++ b/app/uploaders/userpic_uploader.rb @@ -0,0 +1,21 @@ +class UserpicUploader < CarrierWave::Uploader::Base + include CarrierWave::MiniMagick + + def store_dir + "#{ENV['STORAGE_PATH']}/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}/original" + end + + def filename + "#{::SecureRandom.hex(8)}#{File.extname(original_filename).downcase}" if original_filename + end + + + version :small do + process :resize_to_fit => [100, 100] + + def store_dir + "#{ENV['STORAGE_PATH']}/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}/small" + end + end + +end \ No newline at end of file diff --git a/app/views/admin/users/_form.html.erb b/app/views/admin/users/_form.html.erb deleted file mode 100644 index b70ae04..0000000 --- a/app/views/admin/users/_form.html.erb +++ /dev/null @@ -1,12 +0,0 @@ -<%= form.label :name, 'Display name' %>
-<%= form.text_field :name %>
-
-<%= form.label :email %>
-<%= form.text_field :email %>
-
-<%= form.label :password %>
-<%= form.password_field :password %>
-
-<%= form.label :password_confirmation %>
-<%= form.password_field :password_confirmation %>
-
diff --git a/app/views/admin/users/edit.html.erb b/app/views/admin/users/edit.html.erb deleted file mode 100644 index 4092d1c..0000000 --- a/app/views/admin/users/edit.html.erb +++ /dev/null @@ -1,15 +0,0 @@ -

Edit Account

- -<%= form_for @user do |f| %> - <%= f.error_messages %> - <%= render :partial => "form", :object => f %> - <%= f.submit "Update" %> -<% end %> - - - -<%= content_for :action_links do %> -<%= link_to("Delete user", { :action => "destroy", :id => @user }, - :confirm => "Are you sure you want to delete this user?", - :method => :delete) %> -<% end %> \ No newline at end of file diff --git a/app/views/admin/users/index.html.erb b/app/views/admin/users/index.html.erb deleted file mode 100644 index 401a5e2..0000000 --- a/app/views/admin/users/index.html.erb +++ /dev/null @@ -1,7 +0,0 @@ -<% for user in @users %> -

<%= link_to user.name || user.email , user %>

-<% end %> - -<%= content_for :action_links do %> -<%= link_to "New user", new_user_path %> -<% end %> \ No newline at end of file diff --git a/app/views/admin/users/new.html.erb b/app/views/admin/users/new.html.erb deleted file mode 100644 index c73725d..0000000 --- a/app/views/admin/users/new.html.erb +++ /dev/null @@ -1,7 +0,0 @@ -

Register

- -<%= form_for @user do |f| %> - <%= f.error_messages %> - <%= render :partial => "form", :object => f %> - <%= f.submit "Register" %> -<% end %> \ No newline at end of file diff --git a/app/views/admin/users/show.html.erb b/app/views/admin/users/show.html.erb deleted file mode 100644 index 77e999f..0000000 --- a/app/views/admin/users/show.html.erb +++ /dev/null @@ -1,45 +0,0 @@ -

- Name: - <%=h @user.name %> -

- -

- Email: - <%=h @user.email %> -

- - -

- Login count: - <%=h @user.login_count %> -

- -

- Last request at: - <%=h @user.last_request_at %> -

- -

- Last login at: - <%=h @user.last_login_at %> -

- -

- Current login at: - <%=h @user.current_login_at %> -

- -

- Last login ip: - <%=h @user.last_login_ip %> -

- -

- Current login ip: - <%=h @user.current_login_ip %> -

- - -<%= content_for :action_links do %> -<%= link_to 'Edit', edit_user_path(@user) %> -<% end %> \ No newline at end of file diff --git a/app/views/albums/show.html.erb b/app/views/albums/show.html.erb index 84a5cf7..8fb9819 100644 --- a/app/views/albums/show.html.erb +++ b/app/views/albums/show.html.erb @@ -6,7 +6,7 @@ <% for photo in @album.photos.find(:all, :order => "Id ASC") %> <% count += 1%> <% if count == 1 || ( (count-1) / 4.0 == ( (count-1) / 4.0).to_i ) %><% end %> - <%= link_to image_tag( photo.file.preview.url ), [@album.collections.first, @album, photo] %> + <%= link_to image_tag( photo.attachment.preview.url ), [@album.collections.first, @album, photo] %> <% if count / 4.0 == (count / 4.0).to_i %><% end %> <% end %> diff --git a/app/views/collections/_form.html.erb b/app/views/collections/_form.html.erb index 852fb53..39cd6c5 100644 --- a/app/views/collections/_form.html.erb +++ b/app/views/collections/_form.html.erb @@ -15,7 +15,7 @@ <% if album.photos.empty? %> <%= album.title %> <% else %> -<%= image_tag album.photos.first.file.album.url, :alt => album.title %> +<%= image_tag album.photos.first.attachment.album.url, :alt => album.title %> <% end %> <%= album_fields.hidden_field album.id %> diff --git a/app/views/collections/index.html.erb b/app/views/collections/index.html.erb index 25d1207..3c6ea58 100644 --- a/app/views/collections/index.html.erb +++ b/app/views/collections/index.html.erb @@ -1,14 +1,30 @@ -
-<% for collection in @collections %> -
-

<%= link_to collection.title, collection %>

- <%= link_to (image_tag collection.albums.find(:first).photos.first.file.collection.url ), collection_path(collection) unless collection.albums.empty? || collection.albums.find(:first).photos.empty? %> -
+<% @collections.in_groups_of(4).compact.each do |group| %> + <% unless group.compact.empty? %> +
    + <% group.compact.each do |collection| %> + <% unless collection.albums.empty? %> + <% unless collection.albums.first.photos.empty? %> +
  • +
    + <%= image_tag collection.albums.first.photos.first.attachment.collection.url %> +
    +
    <%= collection.title %>
    +

    <%= collection.description %>

    +

    <%= link_to 'View', (collection_path(collection) unless collection.albums.empty? || collection.albums.first.photos.empty?), {:class => 'btn btn-primary'} %>

    +
    +
    +
  • + <% end %> + <% end %> + <% end %> +
+ <% end %> <% end %> -
+ <%= content_for :action_links do %> -<% if has_role?("admin") %> -<%= link_to "New collection", new_collection_path %> + <% if current_user and current_user.has_role?("admin") %> + <%= link_to "New collection", new_collection_path %> + <% end %> <% end %> -<% end %> \ No newline at end of file + diff --git a/app/views/collections/show.html.erb b/app/views/collections/show.html.erb index 90e2feb..6ec99b4 100644 --- a/app/views/collections/show.html.erb +++ b/app/views/collections/show.html.erb @@ -14,7 +14,7 @@ <% end %> <%= content_for :action_links do %> -<% if has_role?("admin") %> +<% if current_user and current_user.has_role?("admin") %> <%= link_to "PDF", collection_path(@collection, :format => 'pdf') %> |  <%= link_to "Edit collection", edit_collection_path(@collection) %> | <%= link_to "New album", new_collection_album_path(@collection) %> diff --git a/app/views/devise/_links.erb b/app/views/devise/_links.erb new file mode 100644 index 0000000..76b85d0 --- /dev/null +++ b/app/views/devise/_links.erb @@ -0,0 +1,24 @@ +<%- if controller_name != 'sessions' %> + <%= link_to t('devise.sign_in'), login_path %>
+<% end -%> + +<%- if devise_mapping.registerable? && controller_name != 'registrations' %> + <%= link_to t('devise.sign_up'), signup_path %>
+<% end -%> + +<%- if devise_mapping.recoverable? && controller_name != 'passwords' %> + <%= link_to t('devise.forgot_your_password'), new_password_path(resource_name) %>
+<% end -%> + +<%- if devise_mapping.confirmable? && controller_name != 'confirmations' %> + <%= link_to t('devise.send_confirmation_instructions'), new_confirmation_path(resource_name) %>
+<% end -%> + +<%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %> + <%= link_to t('devise.send_unlock_instructions'), new_unlock_path(resource_name) %>
+<% end -%> +<%- if devise_mapping.omniauthable? %> + <%- resource_class.omniauth_providers.each do |provider| %> + <%= link_to t('devise.sign_in_with', :provider => provider.to_s.titleize), omniauth_authorize_path(resource_name, provider) %>
+ <% end -%> +<% end -%> \ No newline at end of file diff --git a/app/views/devise/confirmations/new.html.erb b/app/views/devise/confirmations/new.html.erb new file mode 100644 index 0000000..18d81b1 --- /dev/null +++ b/app/views/devise/confirmations/new.html.erb @@ -0,0 +1,12 @@ +

Resend confirmation instructions

+ +<%= form_for(resource, :as => resource_name, :url => confirmation_path(resource_name), :html => { :method => :post }) do |f| %> + <%= devise_error_messages! %> + +
<%= f.label :email %>
+ <%= f.email_field :email %>
+ +
<%= f.submit "Resend confirmation instructions" %>
+<% end %> + +<%= render "links" %> \ No newline at end of file diff --git a/app/views/devise/mailer/confirmation_instructions.html.erb b/app/views/devise/mailer/confirmation_instructions.html.erb new file mode 100644 index 0000000..a5c4585 --- /dev/null +++ b/app/views/devise/mailer/confirmation_instructions.html.erb @@ -0,0 +1,5 @@ +

Welcome <%= @resource.email %>!

+ +

You can confirm your account email through the link below:

+ +

<%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @resource.confirmation_token) %>

diff --git a/app/views/devise/mailer/reset_password_instructions.html.erb b/app/views/devise/mailer/reset_password_instructions.html.erb new file mode 100644 index 0000000..ae9e888 --- /dev/null +++ b/app/views/devise/mailer/reset_password_instructions.html.erb @@ -0,0 +1,8 @@ +

Hello <%= @resource.email %>!

+ +

Someone has requested a link to change your password, and you can do this through the link below.

+ +

<%= link_to 'Change my password', edit_password_url(@resource, :reset_password_token => @resource.reset_password_token) %>

+ +

If you didn't request this, please ignore this email.

+

Your password won't change until you access the link above and create a new one.

diff --git a/app/views/devise/mailer/unlock_instructions.html.erb b/app/views/devise/mailer/unlock_instructions.html.erb new file mode 100644 index 0000000..2263c21 --- /dev/null +++ b/app/views/devise/mailer/unlock_instructions.html.erb @@ -0,0 +1,7 @@ +

Hello <%= @resource.email %>!

+ +

Your account has been locked due to an excessive amount of unsuccessful sign in attempts.

+ +

Click the link below to unlock your account:

+ +

<%= link_to 'Unlock my account', unlock_url(@resource, :unlock_token => @resource.unlock_token) %>

diff --git a/app/views/devise/passwords/edit.html.erb b/app/views/devise/passwords/edit.html.erb new file mode 100644 index 0000000..5f7bcf8 --- /dev/null +++ b/app/views/devise/passwords/edit.html.erb @@ -0,0 +1,16 @@ +

Change your password

+ +<%= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :put }) do |f| %> + <%= devise_error_messages! %> + <%= f.hidden_field :reset_password_token %> + +
<%= f.label :password, "New password" %>
+ <%= f.password_field :password %>
+ +
<%= f.label :password_confirmation, "Confirm new password" %>
+ <%= f.password_field :password_confirmation %>
+ +
<%= f.submit "Change my password" %>
+<% end %> + +<%= render "links" %> \ No newline at end of file diff --git a/app/views/devise/passwords/new.html.erb b/app/views/devise/passwords/new.html.erb new file mode 100644 index 0000000..b0b5690 --- /dev/null +++ b/app/views/devise/passwords/new.html.erb @@ -0,0 +1,12 @@ +

Forgot your password?

+ +<%= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :post }) do |f| %> + <%= devise_error_messages! %> + +
<%= f.label :email %>
+ <%= f.email_field :email %>
+ +
<%= f.submit "Send me reset password instructions" %>
+<% end %> + +<%= render "links" %> \ No newline at end of file diff --git a/app/views/devise/registrations/edit.html.erb b/app/views/devise/registrations/edit.html.erb new file mode 100644 index 0000000..bb66fbf --- /dev/null +++ b/app/views/devise/registrations/edit.html.erb @@ -0,0 +1,25 @@ +

Edit <%= resource_name.to_s.humanize %>

+ +<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %> + <%= devise_error_messages! %> + +
<%= f.label :email %>
+ <%= f.email_field :email %>
+ +
<%= f.label :password %> (leave blank if you don't want to change it)
+ <%= f.password_field :password, :autocomplete => "off" %>
+ +
<%= f.label :password_confirmation %>
+ <%= f.password_field :password_confirmation %>
+ +
<%= f.label :current_password %> (we need your current password to confirm your changes)
+ <%= f.password_field :current_password %>
+ +
<%= f.submit "Update" %>
+<% end %> + +

Cancel my account

+ +

Unhappy? <%= link_to "Cancel my account", registration_path(resource_name), :confirm => "Are you sure?", :method => :delete %>.

+ +<%= link_to "Back", :back %> diff --git a/app/views/devise/registrations/new.html.erb b/app/views/devise/registrations/new.html.erb new file mode 100644 index 0000000..f5136f1 --- /dev/null +++ b/app/views/devise/registrations/new.html.erb @@ -0,0 +1,18 @@ +

Sign up

+ +<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %> + <%= devise_error_messages! %> + +
<%= f.label :email %>
+ <%= f.email_field :email %>
+ +
<%= f.label :password %>
+ <%= f.password_field :password %>
+ +
<%= f.label :password_confirmation %>
+ <%= f.password_field :password_confirmation %>
+ +
<%= f.submit "Sign up" %>
+<% end %> + +<%= render "links" %> diff --git a/app/views/devise/sessions/new.html.erb b/app/views/devise/sessions/new.html.erb new file mode 100644 index 0000000..a4a21fb --- /dev/null +++ b/app/views/devise/sessions/new.html.erb @@ -0,0 +1,17 @@ +

<%= t("devise.sign_in") %>

+ +<%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %> +
<%= f.label :email %>
+ <%= f.email_field :email %>
+ +
<%= f.label :password %>
+ <%= f.password_field :password %>
+ + <% if devise_mapping.rememberable? -%> +
<%= f.check_box :remember_me %> <%= f.label :remember_me %>
+ <% end -%> + +
<%= f.submit "Sign in" %>
+<% end %> + +<%= render "links" %> \ No newline at end of file diff --git a/app/views/devise/unlocks/new.html.erb b/app/views/devise/unlocks/new.html.erb new file mode 100644 index 0000000..0dc79ac --- /dev/null +++ b/app/views/devise/unlocks/new.html.erb @@ -0,0 +1,12 @@ +

Resend unlock instructions

+ +<%= form_for(resource, :as => resource_name, :url => unlock_path(resource_name), :html => { :method => :post }) do |f| %> + <%= devise_error_messages! %> + +
<%= f.label :email %>
+ <%= f.email_field :email %>
+ +
<%= f.submit "Resend unlock instructions" %>
+<% end %> + +<%= render "links" %> \ No newline at end of file diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 470b279..bb305a7 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -1,13 +1,7 @@ - - <%= ENV['TITLE'] || "Photos" %> - - - <%= yield :head %> - <%= stylesheet_link_tag 'application' %> - <%= csrf_meta_tag %> + <%= render :partial => 'shared/head' %>
@@ -43,7 +37,6 @@
-<%= javascript_include_tag 'jquery-1.4.2.js', 'rails', 'balder' %> -<%= yield :javascript %> + diff --git a/app/views/layouts/bootstrap.html.erb b/app/views/layouts/bootstrap.html.erb new file mode 100644 index 0000000..72a800d --- /dev/null +++ b/app/views/layouts/bootstrap.html.erb @@ -0,0 +1,29 @@ + + + + <%= render :partial => 'shared/head' %> + + +<%= render :partial => 'shared/nav_bar' %> +
+ +
+

Hello, world!

+

This is a template for a simple marketing or informational website. It includes a large callout called the hero + unit and three supporting pieces of content. Use it as a starting point to create something more unique.

+

Learn more »

+
+ +
+
+ <%= yield %> +
+
+
+
+

© Company 2012

+
+
+ + + diff --git a/app/views/photos/_form.html.erb b/app/views/photos/_form.html.erb index 39702ca..1718f01 100644 --- a/app/views/photos/_form.html.erb +++ b/app/views/photos/_form.html.erb @@ -1,14 +1,14 @@ <%= content_for :javascript do %> -<%= javascript_include_tag "tag/tag" -%> + <%= javascript_include_tag "tag/tag" -%> <% end %> <%= hidden_field_tag :all_tags, @tags %> <%= form.label :title %>
<%= form.text_field :title %>
-
+
<%= form.label :tag_list %>
-<%= form.text_field :tag_list, { :autocomplete => "off", :class => 'tag_list'} %>
-
+<%= form.text_field :tag_list, {:autocomplete => "off", :class => 'tag_list'} %>
+
<%= form.label :description %>
<%= form.text_area :description %>

-

On disk: ~/<%= @photo.file.path %>

\ No newline at end of file +

On disk: ~/<%= @photo.attachment.path %>

\ No newline at end of file diff --git a/app/views/photos/_photo.pdf.erb b/app/views/photos/_photo.pdf.erb index 00259fe..6b065fd 100644 --- a/app/views/photos/_photo.pdf.erb +++ b/app/views/photos/_photo.pdf.erb @@ -1 +1 @@ -<%= image_tag photo.file.single.url %>
\ No newline at end of file +<%= image_tag photo.attachment.single.url %>
\ No newline at end of file diff --git a/app/views/photos/_thumb.html.erb b/app/views/photos/_thumb.html.erb index fc8870b..d8eff19 100644 --- a/app/views/photos/_thumb.html.erb +++ b/app/views/photos/_thumb.html.erb @@ -1 +1 @@ -<%= link_to (image_tag eval('photo.file.' + (defined?(photosize) ? photosize : "album") + '.url') ), [photo.album.collections.first, photo.album, photo] %> \ No newline at end of file +<%= link_to (image_tag eval('photo.attachment.' + (defined?(photosize) ? photosize : "album") + '.url')), [photo.album.collections.first, photo.album, photo] %> \ No newline at end of file diff --git a/app/views/photos/edit.html.erb b/app/views/photos/edit.html.erb index 6341f62..8befd2f 100644 --- a/app/views/photos/edit.html.erb +++ b/app/views/photos/edit.html.erb @@ -1,17 +1,17 @@

Edit Photo

-<%= image_tag @photo.file.preview.url %> - +<%= image_tag @photo.attachment.preview.url %> + <%= form_for @photo do |f| %> -<%= hidden_field_tag :collection_id, params[:collection_id] %> -<%= hidden_field_tag :album_id, params[:album_id] %> - <%= f.error_messages %> - <%= render :partial => "form", :object => f %> - <%= f.submit "Update" %> + <%= hidden_field_tag :collection_id, params[:collection_id] %> + <%= hidden_field_tag :album_id, params[:album_id] %> + <%= f.error_messages %> + <%= render :partial => "form", :object => f %> + <%= f.submit "Update" %> <% end %> <%= content_for :action_links do %> -<%= link_to("Delete photo", { :action => "destroy", :id => @photo, :collection_id => params[:collection_id] }, - :confirm => "Are you sure you want to delete this photo?", - :method => :delete) %> + <%= link_to("Delete photo", {:action => "destroy", :id => @photo, :collection_id => params[:collection_id]}, + :confirm => "Are you sure you want to delete this photo?", + :method => :delete) %> <% end %> \ No newline at end of file diff --git a/app/views/photos/edit_multiple.html.erb b/app/views/photos/edit_multiple.html.erb index addebb5..d05fb0d 100644 --- a/app/views/photos/edit_multiple.html.erb +++ b/app/views/photos/edit_multiple.html.erb @@ -1,15 +1,15 @@ -<%= form_for :photos, :url => update_multiple_photos_path, :html => { :method => :put } do |f| %> -<% for photo in @photos %> -

-<%= f.fields_for photo, :index => photo.id do |p|%> - <%= p.check_box :_delete %> - <%= render :partial => "photos/thumb", :locals => {:photo => photo } %> - <%= p.text_field :title %> - <%= p.text_field :tags, :value => photo.tag_list %> -<% end%> -

-<% end%> -

<%= f.submit "Submit" %>

+<%= form_for :photos, :url => update_multiple_photos_path, :html => {:method => :put} do |f| %> + <% for photo in @photos %> +

+ <%= f.fields_for photo, :index => photo.id do |p| %> + <%= p.check_box :_delete %> + <%= render :partial => "photos/thumb", :locals => {:photo => photo} %> + <%= p.text_field :title %> + <%= p.text_field :tags, :value => photo.tag_list %> + <% end %> +

+ <% end %> +

<%= f.submit "Submit" %>

<% end %> -
<%= link_to "Back to #{@album.title}", @album %> \ No newline at end of file +
<%= link_to "Back to #{@album.title}", @album %> \ No newline at end of file diff --git a/app/views/photos/index.html.erb b/app/views/photos/index.html.erb index a748a1d..4721360 100644 --- a/app/views/photos/index.html.erb +++ b/app/views/photos/index.html.erb @@ -1,6 +1,6 @@ -
    <%= render :partial => 'photos/thumb',:collection => @photos, :as => :photo %>
+
    <%= render :partial => 'photos/thumb', :collection => @photos, :as => :photo %>
<%= content_for :action_links do %> -<%= link_to "Show albums containing photos tagged with #{params[:q]}", albums_path(:q => params[:q]) if params[:q] %> -<%= link_to "Show all photos tagged with #{params[:tag_id]}", tag_photos_path(params[:tag_id]) if params[:tag_id] && params[:album_id] %> + <%= link_to "Show albums containing photos tagged with #{params[:q]}", albums_path(:q => params[:q]) if params[:q] %> + <%= link_to "Show all photos tagged with #{params[:tag_id]}", tag_photos_path(params[:tag_id]) if params[:tag_id] && params[:album_id] %> <% end %> \ No newline at end of file diff --git a/app/views/photos/show.html.erb b/app/views/photos/show.html.erb index 8399e47..4d458a7 100644 --- a/app/views/photos/show.html.erb +++ b/app/views/photos/show.html.erb @@ -1,34 +1,34 @@ -

<%= @photo.title%>

+

<%= @photo.title %>

- -

<%= link_to_if @next, image_tag(@photo.file.single.url ), [ @photo.album.collections.first, @photo.album, @next] %>

+ +

<%= link_to_if @next, image_tag(@photo.attachment.single.url), [@photo.album.collections.first, @photo.album, @next] %>

<%= @photo.description %>

-

Tagged with: -<% for tag in @photo.tags.map{|tag|tag.title}.sort %> -<%= link_to tag, tag_photos_path(tag) %> -<% end %> +

Tagged with: + <% for tag in @photo.tags.map { |tag| tag.title }.sort %> + <%= link_to tag, tag_photos_path(tag) %> + <% end %> -<%= content_for :action_links do %> -<% if has_role?("admin") %> -<% if params[:collection_id] %> -<%= link_to "Edit photo", edit_collection_album_photo_path(params[:collection_id], params[:album_id], @photo) %> -<% else %> -<%= link_to "Edit photo", edit_photo_path(@photo) %> -<% end %> -<% end %> + <%= content_for :action_links do %> + <% if current_user and current_user.has_role?("admin") %> + <% if params[:collection_id] %> + <%= link_to "Edit photo", edit_collection_album_photo_path(params[:collection_id], params[:album_id], @photo) %> + <% else %> + <%= link_to "Edit photo", edit_photo_path(@photo) %> + <% end %> + <% end %> <% end %> \ No newline at end of file diff --git a/app/views/photos/untouched.html.erb b/app/views/photos/untouched.html.erb index 3b1424c..ebb5c22 100644 --- a/app/views/photos/untouched.html.erb +++ b/app/views/photos/untouched.html.erb @@ -1,12 +1,12 @@ -<%= form_for :photos, :url => update_multiple_photos_path, :html => { :method => :put } do |f| %> -<% for photo in @photos %> -

-<%= f.fields_for photo do |p|%> - <%= render :partial => "photos/thumb", :locals => {:photo => photo } %> - <%= p.text_field :title, :index => photo.id %> - <%= p.text_field :tags, :index => photo.id, :value => photo.tag_list %> -<% end%> -

-<% end%> -

<%= f.submit "Submit" %>

+<%= form_for :photos, :url => update_multiple_photos_path, :html => {:method => :put} do |f| %> + <% for photo in @photos %> +

+ <%= f.fields_for photo do |p| %> + <%= render :partial => "photos/thumb", :locals => {:photo => photo} %> + <%= p.text_field :title, :index => photo.id %> + <%= p.text_field :tags, :index => photo.id, :value => photo.tag_list %> + <% end %> +

+ <% end %> +

<%= f.submit "Submit" %>

<% end %> \ No newline at end of file diff --git a/app/views/photos/upload.html.erb b/app/views/photos/upload.html.erb index 407d84b..a473b90 100644 --- a/app/views/photos/upload.html.erb +++ b/app/views/photos/upload.html.erb @@ -1,13 +1,7 @@ <%= content_for :javascript do %> - - <%= javascript_include_tag "plupload/js/plupload.full.js" -%> - <%= javascript_include_tag "plupload/js/jquery.plupload.queue/jquery.plupload.queue.js" -%> -