From 52ceb30cf8bf20d90dc6dcea72b3afa6034d4a54 Mon Sep 17 00:00:00 2001 From: Dan Barber Date: Mon, 10 Oct 2011 15:39:52 +0100 Subject: [PATCH] First commit. --- .gitignore | 6 + .rvmrc | 47 ++++ Gemfile | 50 ++++ Gemfile.lock | 160 +++++++++++ README | 261 ++++++++++++++++++ Rakefile | 7 + app/assets/images/admin/logo.png | Bin 0 -> 4070 bytes app/assets/images/rails.png | Bin 0 -> 6646 bytes app/assets/javascripts/admin.js | 9 + app/assets/javascripts/admin/admin.js.coffee | 3 + .../javascripts/admin/dashboard.js.coffee | 3 + .../javascripts/admin/downloads.js.coffee | 3 + .../javascripts/admin/unlocks.js.coffee | 3 + app/assets/javascripts/application.js | 9 + app/assets/javascripts/home.js.coffee | 3 + app/assets/stylesheets/admin.css | 8 + app/assets/stylesheets/admin/admin.css.sass | 137 +++++++++ .../stylesheets/admin/dashboard.css.sass | 3 + .../stylesheets/admin/downloads.css.sass | 3 + app/assets/stylesheets/admin/flash.css.sass | 14 + .../stylesheets/admin/formtastic.css.sass | 103 +++++++ app/assets/stylesheets/admin/menu.css.sass | 47 ++++ app/assets/stylesheets/admin/unlocks.css.scss | 3 + app/assets/stylesheets/application.css | 7 + .../stylesheets/application/home.css.sass | 3 + app/assets/stylesheets/home.css.scss | 3 + .../stylesheets/includes/_box_shadow.sass | 4 + app/assets/stylesheets/includes/_button.sass | 24 ++ .../stylesheets/includes/_round_corners.sass | 5 + .../stylesheets/includes/_transition.sass | 5 + .../stylesheets/includes/_v_linear_grad.sass | 7 + app/controllers/admin/admin_controller.rb | 4 + .../admin/admin_users_controller.rb | 69 +++++ .../admin/confirmations_controller.rb | 60 ++++ app/controllers/admin/dashboard_controller.rb | 2 + app/controllers/admin/passwords_controller.rb | 3 + .../admin/registrations_controller.rb | 3 + app/controllers/admin/sessions_controller.rb | 3 + app/controllers/admin/unlocks_controller.rb | 3 + app/controllers/application_controller.rb | 12 + app/controllers/home_controller.rb | 4 + app/helpers/admin/admin_helper.rb | 2 + app/helpers/admin/dashboard_helper.rb | 2 + app/helpers/admin/downloads_helper.rb | 2 + app/helpers/admin/unlocks_helper.rb | 2 + app/helpers/application_helper.rb | 2 + app/helpers/home_helper.rb | 2 + app/mailers/.gitkeep | 0 app/models/.gitkeep | 0 app/models/admin_user.rb | 36 +++ .../admin/admin_users/_admin_user.html.haml | 7 + app/views/admin/admin_users/_form.html.haml | 3 + app/views/admin/admin_users/edit.html.haml | 2 + .../admin/admin_users/edit_password.html.haml | 11 + app/views/admin/admin_users/index.html.haml | 16 ++ app/views/admin/admin_users/new.html.haml | 2 + app/views/admin/confirmations/new.html.haml | 11 + app/views/admin/confirmations/show.html.haml | 11 + app/views/admin/dashboard/index.html.haml | 1 + app/views/admin/layouts/admin.html.haml | 14 + app/views/admin/layouts/login.html.haml | 13 + app/views/admin/passwords/edit.html.haml | 14 + app/views/admin/passwords/new.html.haml | 11 + app/views/admin/sessions/new.html.haml | 14 + app/views/admin/shared/_footer.html.haml | 0 app/views/admin/shared/_header.html.haml | 3 + .../admin/shared/_login_header.html.haml | 1 + app/views/admin/shared/_menu.html.haml | 4 + app/views/admin/shared/_user.html.haml | 6 + app/views/admin/unlocks/new.html.haml | 11 + app/views/home/index.html.haml | 1 + app/views/layouts/application.html.erb | 14 + app/views/shared/_banner.html.haml | 2 + app/views/shared/_flash_messages.html.haml | 5 + config.ru | 4 + config/application.rb | 48 ++++ config/boot.rb | 6 + config/environment.rb | 5 + config/environments/development.rb | 44 +++ config/environments/production.rb | 74 +++++ config/environments/test.rb | 42 +++ config/initializers/backtrace_silencers.rb | 7 + config/initializers/devise.rb | 210 ++++++++++++++ config/initializers/inflections.rb | 10 + config/initializers/mime_types.rb | 5 + config/initializers/secret_token.rb | 7 + config/initializers/session_store.rb | 8 + config/initializers/wrap_parameters.rb | 14 + config/locales/devise.en.yml | 58 ++++ config/locales/en.yml | 5 + config/routes.rb | 76 +++++ ...0111007155450_devise_create_admin_users.rb | 28 ++ db/schema.rb | 61 ++++ db/seeds.rb | 7 + doc/README_FOR_APP | 2 + lib/assets/.gitkeep | 0 lib/tasks/.gitkeep | 0 log/.gitkeep | 0 logo.png | Bin 0 -> 4070 bytes public/404.html | 26 ++ public/422.html | 26 ++ public/500.html | 26 ++ public/favicon.ico | 0 public/index.html_ | 241 ++++++++++++++++ public/robots.txt | 5 + script/rails | 6 + test/fixtures/.gitkeep | 0 test/fixtures/admin_users.yml | 11 + test/functional/.gitkeep | 0 .../functional/admin/admin_controller_test.rb | 7 + .../admin/dashboard_controller_test.rb | 7 + .../admin/downloads_controller_test.rb | 7 + .../admin/unlocks_controller_test.rb | 7 + test/functional/home_controller_test.rb | 7 + test/integration/.gitkeep | 0 test/performance/browsing_test.rb | 12 + test/test_helper.rb | 13 + test/unit/.gitkeep | 0 test/unit/admin_user_test.rb | 7 + test/unit/helpers/admin/admin_helper_test.rb | 4 + .../helpers/admin/dashboard_helper_test.rb | 4 + .../helpers/admin/downloads_helper_test.rb | 4 + .../unit/helpers/admin/unlocks_helper_test.rb | 4 + test/unit/helpers/home_helper_test.rb | 4 + vendor/assets/stylesheets/.gitkeep | 0 vendor/plugins/.gitkeep | 0 126 files changed, 2477 insertions(+) create mode 100644 .gitignore create mode 100644 .rvmrc create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 README create mode 100644 Rakefile create mode 100644 app/assets/images/admin/logo.png create mode 100644 app/assets/images/rails.png create mode 100644 app/assets/javascripts/admin.js create mode 100644 app/assets/javascripts/admin/admin.js.coffee create mode 100644 app/assets/javascripts/admin/dashboard.js.coffee create mode 100644 app/assets/javascripts/admin/downloads.js.coffee create mode 100644 app/assets/javascripts/admin/unlocks.js.coffee create mode 100644 app/assets/javascripts/application.js create mode 100644 app/assets/javascripts/home.js.coffee create mode 100644 app/assets/stylesheets/admin.css create mode 100644 app/assets/stylesheets/admin/admin.css.sass create mode 100644 app/assets/stylesheets/admin/dashboard.css.sass create mode 100644 app/assets/stylesheets/admin/downloads.css.sass create mode 100644 app/assets/stylesheets/admin/flash.css.sass create mode 100644 app/assets/stylesheets/admin/formtastic.css.sass create mode 100644 app/assets/stylesheets/admin/menu.css.sass create mode 100644 app/assets/stylesheets/admin/unlocks.css.scss create mode 100644 app/assets/stylesheets/application.css create mode 100644 app/assets/stylesheets/application/home.css.sass create mode 100644 app/assets/stylesheets/home.css.scss create mode 100644 app/assets/stylesheets/includes/_box_shadow.sass create mode 100644 app/assets/stylesheets/includes/_button.sass create mode 100644 app/assets/stylesheets/includes/_round_corners.sass create mode 100644 app/assets/stylesheets/includes/_transition.sass create mode 100644 app/assets/stylesheets/includes/_v_linear_grad.sass create mode 100644 app/controllers/admin/admin_controller.rb create mode 100644 app/controllers/admin/admin_users_controller.rb create mode 100644 app/controllers/admin/confirmations_controller.rb create mode 100644 app/controllers/admin/dashboard_controller.rb create mode 100644 app/controllers/admin/passwords_controller.rb create mode 100644 app/controllers/admin/registrations_controller.rb create mode 100644 app/controllers/admin/sessions_controller.rb create mode 100644 app/controllers/admin/unlocks_controller.rb create mode 100644 app/controllers/application_controller.rb create mode 100644 app/controllers/home_controller.rb create mode 100644 app/helpers/admin/admin_helper.rb create mode 100644 app/helpers/admin/dashboard_helper.rb create mode 100644 app/helpers/admin/downloads_helper.rb create mode 100644 app/helpers/admin/unlocks_helper.rb create mode 100644 app/helpers/application_helper.rb create mode 100644 app/helpers/home_helper.rb create mode 100644 app/mailers/.gitkeep create mode 100644 app/models/.gitkeep create mode 100644 app/models/admin_user.rb create mode 100644 app/views/admin/admin_users/_admin_user.html.haml create mode 100644 app/views/admin/admin_users/_form.html.haml create mode 100644 app/views/admin/admin_users/edit.html.haml create mode 100644 app/views/admin/admin_users/edit_password.html.haml create mode 100644 app/views/admin/admin_users/index.html.haml create mode 100644 app/views/admin/admin_users/new.html.haml create mode 100644 app/views/admin/confirmations/new.html.haml create mode 100644 app/views/admin/confirmations/show.html.haml create mode 100644 app/views/admin/dashboard/index.html.haml create mode 100644 app/views/admin/layouts/admin.html.haml create mode 100644 app/views/admin/layouts/login.html.haml create mode 100644 app/views/admin/passwords/edit.html.haml create mode 100644 app/views/admin/passwords/new.html.haml create mode 100644 app/views/admin/sessions/new.html.haml create mode 100644 app/views/admin/shared/_footer.html.haml create mode 100644 app/views/admin/shared/_header.html.haml create mode 100644 app/views/admin/shared/_login_header.html.haml create mode 100644 app/views/admin/shared/_menu.html.haml create mode 100644 app/views/admin/shared/_user.html.haml create mode 100644 app/views/admin/unlocks/new.html.haml create mode 100644 app/views/home/index.html.haml create mode 100644 app/views/layouts/application.html.erb create mode 100644 app/views/shared/_banner.html.haml create mode 100644 app/views/shared/_flash_messages.html.haml create mode 100644 config.ru create mode 100644 config/application.rb create mode 100644 config/boot.rb create mode 100644 config/environment.rb create mode 100644 config/environments/development.rb create mode 100644 config/environments/production.rb create mode 100644 config/environments/test.rb create mode 100644 config/initializers/backtrace_silencers.rb create mode 100644 config/initializers/devise.rb create mode 100644 config/initializers/inflections.rb create mode 100644 config/initializers/mime_types.rb create mode 100644 config/initializers/secret_token.rb create mode 100644 config/initializers/session_store.rb create mode 100644 config/initializers/wrap_parameters.rb create mode 100644 config/locales/devise.en.yml create mode 100644 config/locales/en.yml create mode 100644 config/routes.rb create mode 100644 db/migrate/20111007155450_devise_create_admin_users.rb create mode 100644 db/schema.rb create mode 100644 db/seeds.rb create mode 100644 doc/README_FOR_APP create mode 100644 lib/assets/.gitkeep create mode 100644 lib/tasks/.gitkeep create mode 100644 log/.gitkeep create mode 100644 logo.png create mode 100644 public/404.html create mode 100644 public/422.html create mode 100644 public/500.html create mode 100644 public/favicon.ico create mode 100644 public/index.html_ create mode 100644 public/robots.txt create mode 100755 script/rails create mode 100644 test/fixtures/.gitkeep create mode 100644 test/fixtures/admin_users.yml create mode 100644 test/functional/.gitkeep create mode 100644 test/functional/admin/admin_controller_test.rb create mode 100644 test/functional/admin/dashboard_controller_test.rb create mode 100644 test/functional/admin/downloads_controller_test.rb create mode 100644 test/functional/admin/unlocks_controller_test.rb create mode 100644 test/functional/home_controller_test.rb create mode 100644 test/integration/.gitkeep create mode 100644 test/performance/browsing_test.rb create mode 100644 test/test_helper.rb create mode 100644 test/unit/.gitkeep create mode 100644 test/unit/admin_user_test.rb create mode 100644 test/unit/helpers/admin/admin_helper_test.rb create mode 100644 test/unit/helpers/admin/dashboard_helper_test.rb create mode 100644 test/unit/helpers/admin/downloads_helper_test.rb create mode 100644 test/unit/helpers/admin/unlocks_helper_test.rb create mode 100644 test/unit/helpers/home_helper_test.rb create mode 100644 vendor/assets/stylesheets/.gitkeep create mode 100644 vendor/plugins/.gitkeep diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..11f206f --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.bundle +db/*.sqlite3 +log/*.log +tmp/ +.sass-cache/ +.DS_* diff --git a/.rvmrc b/.rvmrc new file mode 100644 index 0000000..d03940c --- /dev/null +++ b/.rvmrc @@ -0,0 +1,47 @@ +#!/usr/bin/env bash + +# This is an RVM Project .rvmrc file, used to automatically load the ruby +# development environment upon cd'ing into the directory + +# First we specify our desired [@], the @gemset name is optional. +environment_id="ruby-1.9.2-p290@template" + +# +# Uncomment following line if you want options to be set only for given project. +# +# PROJECT_JRUBY_OPTS=( --1.9 ) + +# +# First we attempt to load the desired environment directly from the environment +# file. This is very fast and efficient compared to running through the entire +# CLI and selector. If you want feedback on which environment was used then +# insert the word 'use' after --create as this triggers verbose mode. +# +if [[ -d "${rvm_path:-$HOME/.rvm}/environments" \ + && -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]] +then + \. "${rvm_path:-$HOME/.rvm}/environments/$environment_id" + + if [[ -s "${rvm_path:-$HOME/.rvm}/hooks/after_use" ]] + then + . "${rvm_path:-$HOME/.rvm}/hooks/after_use" + fi +else + # If the environment file has not yet been created, use the RVM CLI to select. + if ! rvm --create use "$environment_id" + then + echo "Failed to create RVM environment '${environment_id}'." + exit 1 + fi +fi + +# +# If you use an RVM gemset file to install a list of gems (*.gems), you can have +# it be automatically loaded. Uncomment the following and adjust the filename if +# necessary. +# +# filename=".gems" +# if [[ -s "$filename" ]] ; then +# rvm gemset import "$filename" | grep -v already | grep -v listed | grep -v complete | sed '/^$/d' +# fi + diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..5df21e9 --- /dev/null +++ b/Gemfile @@ -0,0 +1,50 @@ +source 'http://rubygems.org' + +gem 'rails', '3.1.0' + +# Bundle edge Rails instead: +# gem 'rails', :git => 'git://github.com/rails/rails.git' + +gem 'sqlite3' + + +# Gems used only for assets and not required +# in production environments by default. +group :assets do + gem 'sass-rails', " ~> 3.1.0" + gem 'coffee-rails', "~> 3.1.0" + gem 'uglifier' +end + +gem 'jquery-rails' + +# Use unicorn as the web server +# gem 'unicorn' + +# Deploy with Capistrano +# gem 'capistrano' + +# To use debugger +# gem 'ruby-debug19', :require => 'ruby-debug' + +group :development do + gem 'ruby_parser' + gem 'hpricot' + gem 'powder' +end + +group :test do + # Pretty printed test output + gem 'turn', :require => false +end + +gem 'sass-rails', "~> 3.1.0" +gem 'nested_set' +gem 'devise' +gem 'acts_as_markup' +#gem 'meta_where' +gem 'haml' +gem 'yaml_db' +gem 'rdiscount' +gem 'formtastic', "~> 2.0.0" +gem 'rubypants' diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..49d460d --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,160 @@ +GEM + remote: http://rubygems.org/ + specs: + RedCloth (4.2.8) + actionmailer (3.1.0) + actionpack (= 3.1.0) + mail (~> 2.3.0) + actionpack (3.1.0) + activemodel (= 3.1.0) + activesupport (= 3.1.0) + builder (~> 3.0.0) + erubis (~> 2.7.0) + i18n (~> 0.6) + rack (~> 1.3.2) + rack-cache (~> 1.0.3) + rack-mount (~> 0.8.2) + rack-test (~> 0.6.1) + sprockets (~> 2.0.0) + activemodel (3.1.0) + activesupport (= 3.1.0) + bcrypt-ruby (~> 3.0.0) + builder (~> 3.0.0) + i18n (~> 0.6) + activerecord (3.1.0) + activemodel (= 3.1.0) + activesupport (= 3.1.0) + arel (~> 2.2.1) + tzinfo (~> 0.3.29) + activeresource (3.1.0) + activemodel (= 3.1.0) + activesupport (= 3.1.0) + activesupport (3.1.0) + multi_json (~> 1.0) + acts_as_markup (1.3.4) + RedCloth (~> 4.2) + activerecord (>= 2.3.2) + activesupport (>= 2.3.2) + rdiscount (~> 1.3) + wikitext (~> 2.0) + ansi (1.3.0) + arel (2.2.1) + bcrypt-ruby (3.0.1) + builder (3.0.0) + coffee-rails (3.1.1) + coffee-script (>= 2.2.0) + railties (~> 3.1.0) + coffee-script (2.2.0) + coffee-script-source + execjs + coffee-script-source (1.1.2) + devise (1.4.8) + bcrypt-ruby (~> 3.0) + orm_adapter (~> 0.0.3) + warden (~> 1.0.3) + erubis (2.7.0) + execjs (1.2.9) + multi_json (~> 1.0) + formtastic (2.0.2) + rails (~> 3.0) + haml (3.1.3) + hike (1.2.1) + hpricot (0.8.4) + i18n (0.6.0) + jquery-rails (1.0.14) + railties (~> 3.0) + thor (~> 0.14) + mail (2.3.0) + i18n (>= 0.4.0) + mime-types (~> 1.16) + treetop (~> 1.4.8) + mime-types (1.16) + multi_json (1.0.3) + nested_set (1.6.8) + activerecord (>= 3.0.0) + railties (>= 3.0.0) + orm_adapter (0.0.5) + polyglot (0.3.2) + powder (0.1.6) + thor (>= 0.11.5) + rack (1.3.4) + rack-cache (1.0.3) + rack (>= 0.4) + rack-mount (0.8.3) + rack (>= 1.0.0) + rack-ssl (1.3.2) + rack + rack-test (0.6.1) + rack (>= 1.0) + rails (3.1.0) + actionmailer (= 3.1.0) + actionpack (= 3.1.0) + activerecord (= 3.1.0) + activeresource (= 3.1.0) + activesupport (= 3.1.0) + bundler (~> 1.0) + railties (= 3.1.0) + railties (3.1.0) + actionpack (= 3.1.0) + activesupport (= 3.1.0) + rack-ssl (~> 1.3.2) + rake (>= 0.8.7) + rdoc (~> 3.4) + thor (~> 0.14.6) + rake (0.9.2) + rdiscount (1.6.8) + rdoc (3.9.4) + ruby_parser (2.3.1) + sexp_processor (~> 3.0) + rubypants (0.2.0) + sass (3.1.10) + sass-rails (3.1.4) + actionpack (~> 3.1.0) + railties (~> 3.1.0) + sass (>= 3.1.4) + sprockets (~> 2.0.0) + tilt (~> 1.3.2) + sexp_processor (3.0.7) + sprockets (2.0.2) + hike (~> 1.2) + rack (~> 1.0) + tilt (~> 1.1, != 1.3.0) + sqlite3 (1.3.4) + thor (0.14.6) + tilt (1.3.3) + treetop (1.4.10) + polyglot + polyglot (>= 0.3.1) + turn (0.8.2) + ansi (>= 1.2.2) + tzinfo (0.3.30) + uglifier (1.0.3) + execjs (>= 0.3.0) + multi_json (>= 1.0.2) + warden (1.0.6) + rack (>= 1.0) + wikitext (2.1.1) + yaml_db (0.2.1) + +PLATFORMS + ruby + +DEPENDENCIES + acts_as_markup + coffee-rails (~> 3.1.0) + devise + formtastic (~> 2.0.0) + haml + hpricot + jquery-rails + nested_set + powder + rails (= 3.1.0) + rdiscount + ruby_parser + rubypants + sass-rails (~> 3.1.0) + sqlite3 + turn + uglifier + yaml_db diff --git a/README b/README new file mode 100644 index 0000000..7c36f23 --- /dev/null +++ b/README @@ -0,0 +1,261 @@ +== Welcome to Rails + +Rails is a web-application framework that includes everything needed to create +database-backed web applications according to the Model-View-Control pattern. + +This pattern splits the view (also called the presentation) into "dumb" +templates that are primarily responsible for inserting pre-built data in between +HTML tags. The model contains the "smart" domain objects (such as Account, +Product, Person, Post) that holds all the business logic and knows how to +persist themselves to a database. The controller handles the incoming requests +(such as Save New Account, Update Product, Show Post) by manipulating the model +and directing data to the view. + +In Rails, the model is handled by what's called an object-relational mapping +layer entitled Active Record. This layer allows you to present the data from +database rows as objects and embellish these data objects with business logic +methods. You can read more about Active Record in +link:files/vendor/rails/activerecord/README.html. + +The controller and view are handled by the Action Pack, which handles both +layers by its two parts: Action View and Action Controller. These two layers +are bundled in a single package due to their heavy interdependence. This is +unlike the relationship between the Active Record and Action Pack that is much +more separate. Each of these packages can be used independently outside of +Rails. You can read more about Action Pack in +link:files/vendor/rails/actionpack/README.html. + + +== Getting Started + +1. At the command prompt, create a new Rails application: + rails new myapp (where myapp is the application name) + +2. Change directory to myapp and start the web server: + cd myapp; rails server (run with --help for options) + +3. Go to http://localhost:3000/ and you'll see: + "Welcome aboard: You're riding Ruby on Rails!" + +4. Follow the guidelines to start developing your application. You can find +the following resources handy: + +* The Getting Started Guide: http://guides.rubyonrails.org/getting_started.html +* Ruby on Rails Tutorial Book: http://www.railstutorial.org/ + + +== Debugging Rails + +Sometimes your application goes wrong. Fortunately there are a lot of tools that +will help you debug it and get it back on the rails. + +First area to check is the application log files. Have "tail -f" commands +running on the server.log and development.log. Rails will automatically display +debugging and runtime information to these files. Debugging info will also be +shown in the browser on requests from 127.0.0.1. + +You can also log your own messages directly into the log file from your code +using the Ruby logger class from inside your controllers. Example: + + class WeblogController < ActionController::Base + def destroy + @weblog = Weblog.find(params[:id]) + @weblog.destroy + logger.info("#{Time.now} Destroyed Weblog ID ##{@weblog.id}!") + end + end + +The result will be a message in your log file along the lines of: + + Mon Oct 08 14:22:29 +1000 2007 Destroyed Weblog ID #1! + +More information on how to use the logger is at http://www.ruby-doc.org/core/ + +Also, Ruby documentation can be found at http://www.ruby-lang.org/. There are +several books available online as well: + +* Programming Ruby: http://www.ruby-doc.org/docs/ProgrammingRuby/ (Pickaxe) +* Learn to Program: http://pine.fm/LearnToProgram/ (a beginners guide) + +These two books will bring you up to speed on the Ruby language and also on +programming in general. + + +== Debugger + +Debugger support is available through the debugger command when you start your +Mongrel or WEBrick server with --debugger. This means that you can break out of +execution at any point in the code, investigate and change the model, and then, +resume execution! You need to install ruby-debug to run the server in debugging +mode. With gems, use sudo gem install ruby-debug. Example: + + class WeblogController < ActionController::Base + def index + @posts = Post.all + debugger + end + end + +So the controller will accept the action, run the first line, then present you +with a IRB prompt in the server window. Here you can do things like: + + >> @posts.inspect + => "[#nil, "body"=>nil, "id"=>"1"}>, + #"Rails", "body"=>"Only ten..", "id"=>"2"}>]" + >> @posts.first.title = "hello from a debugger" + => "hello from a debugger" + +...and even better, you can examine how your runtime objects actually work: + + >> f = @posts.first + => #nil, "body"=>nil, "id"=>"1"}> + >> f. + Display all 152 possibilities? (y or n) + +Finally, when you're ready to resume execution, you can enter "cont". + + +== Console + +The console is a Ruby shell, which allows you to interact with your +application's domain model. Here you'll have all parts of the application +configured, just like it is when the application is running. You can inspect +domain models, change values, and save to the database. Starting the script +without arguments will launch it in the development environment. + +To start the console, run rails console from the application +directory. + +Options: + +* Passing the -s, --sandbox argument will rollback any modifications + made to the database. +* Passing an environment name as an argument will load the corresponding + environment. Example: rails console production. + +To reload your controllers and models after launching the console run +reload! + +More information about irb can be found at: +link:http://www.rubycentral.org/pickaxe/irb.html + + +== dbconsole + +You can go to the command line of your database directly through rails +dbconsole. You would be connected to the database with the credentials +defined in database.yml. Starting the script without arguments will connect you +to the development database. Passing an argument will connect you to a different +database, like rails dbconsole production. Currently works for MySQL, +PostgreSQL and SQLite 3. + +== Description of Contents + +The default directory structure of a generated Ruby on Rails application: + + |-- app + | |-- assets + | |-- images + | |-- javascripts + | `-- stylesheets + | |-- controllers + | |-- helpers + | |-- mailers + | |-- models + | `-- views + | `-- layouts + |-- config + | |-- environments + | |-- initializers + | `-- locales + |-- db + |-- doc + |-- lib + | `-- tasks + |-- log + |-- public + |-- script + |-- test + | |-- fixtures + | |-- functional + | |-- integration + | |-- performance + | `-- unit + |-- tmp + | |-- cache + | |-- pids + | |-- sessions + | `-- sockets + `-- vendor + |-- assets + `-- stylesheets + `-- plugins + +app + Holds all the code that's specific to this particular application. + +app/assets + Contains subdirectories for images, stylesheets, and JavaScript files. + +app/controllers + Holds controllers that should be named like weblogs_controller.rb for + automated URL mapping. All controllers should descend from + ApplicationController which itself descends from ActionController::Base. + +app/models + Holds models that should be named like post.rb. Models descend from + ActiveRecord::Base by default. + +app/views + Holds the template files for the view that should be named like + weblogs/index.html.erb for the WeblogsController#index action. All views use + eRuby syntax by default. + +app/views/layouts + Holds the template files for layouts to be used with views. This models the + common header/footer method of wrapping views. In your views, define a layout + using the layout :default and create a file named default.html.erb. + Inside default.html.erb, call <% yield %> to render the view using this + layout. + +app/helpers + Holds view helpers that should be named like weblogs_helper.rb. These are + generated for you automatically when using generators for controllers. + Helpers can be used to wrap functionality for your views into methods. + +config + Configuration files for the Rails environment, the routing map, the database, + and other dependencies. + +db + Contains the database schema in schema.rb. db/migrate contains all the + sequence of Migrations for your schema. + +doc + This directory is where your application documentation will be stored when + generated using rake doc:app + +lib + Application specific libraries. Basically, any kind of custom code that + doesn't belong under controllers, models, or helpers. This directory is in + the load path. + +public + The directory available for the web server. Also contains the dispatchers and the + default HTML files. This should be set as the DOCUMENT_ROOT of your web + server. + +script + Helper scripts for automation and generation. + +test + Unit and functional tests along with fixtures. When using the rails generate + command, template test files will be generated for you and placed in this + directory. + +vendor + External libraries that the application depends on. Also includes the plugins + subdirectory. If the app has frozen rails, those gems also go here, under + vendor/rails/. This directory is in the load path. diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..7a36cca --- /dev/null +++ b/Rakefile @@ -0,0 +1,7 @@ +#!/usr/bin/env rake +# Add your own tasks in files placed in lib/tasks ending in .rake, +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. + +require File.expand_path('../config/application', __FILE__) + +Abidownloads::Application.load_tasks diff --git a/app/assets/images/admin/logo.png b/app/assets/images/admin/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..fec2fca88643d4ecb2def9e4d75324d133ee895e GIT binary patch literal 4070 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 AQ~&?~ literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/admin.js b/app/assets/javascripts/admin.js new file mode 100644 index 0000000..7bd1f59 --- /dev/null +++ b/app/assets/javascripts/admin.js @@ -0,0 +1,9 @@ +// 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_directory ./admin diff --git a/app/assets/javascripts/admin/admin.js.coffee b/app/assets/javascripts/admin/admin.js.coffee new file mode 100644 index 0000000..7615679 --- /dev/null +++ b/app/assets/javascripts/admin/admin.js.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/ diff --git a/app/assets/javascripts/admin/dashboard.js.coffee b/app/assets/javascripts/admin/dashboard.js.coffee new file mode 100644 index 0000000..7615679 --- /dev/null +++ b/app/assets/javascripts/admin/dashboard.js.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/ diff --git a/app/assets/javascripts/admin/downloads.js.coffee b/app/assets/javascripts/admin/downloads.js.coffee new file mode 100644 index 0000000..7615679 --- /dev/null +++ b/app/assets/javascripts/admin/downloads.js.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/ diff --git a/app/assets/javascripts/admin/unlocks.js.coffee b/app/assets/javascripts/admin/unlocks.js.coffee new file mode 100644 index 0000000..7615679 --- /dev/null +++ b/app/assets/javascripts/admin/unlocks.js.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/ diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js new file mode 100644 index 0000000..37c7bfc --- /dev/null +++ b/app/assets/javascripts/application.js @@ -0,0 +1,9 @@ +// 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_tree . diff --git a/app/assets/javascripts/home.js.coffee b/app/assets/javascripts/home.js.coffee new file mode 100644 index 0000000..7615679 --- /dev/null +++ b/app/assets/javascripts/home.js.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/ diff --git a/app/assets/stylesheets/admin.css b/app/assets/stylesheets/admin.css new file mode 100644 index 0000000..ab7dfe9 --- /dev/null +++ b/app/assets/stylesheets/admin.css @@ -0,0 +1,8 @@ +/* + * This is a manifest file that'll automatically include all the stylesheets available in this directory + * and any sub-directories. You're free to add application-wide styles to this file and they'll appear at + * the top of the compiled file, but it's generally better to create a new file per style scope. + *= require_self + *= require formtastic + *= require_directory ./admin +*/ \ No newline at end of file diff --git a/app/assets/stylesheets/admin/admin.css.sass b/app/assets/stylesheets/admin/admin.css.sass new file mode 100644 index 0000000..1237f54 --- /dev/null +++ b/app/assets/stylesheets/admin/admin.css.sass @@ -0,0 +1,137 @@ +// Place all the styles related to the admin/admin controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ + +@import "../includes/v_linear_grad" +@import "../includes/round_corners" +@import "../includes/transition" +@import "../includes/box_shadow" + +body + background-color: #999 + color: #333 + font-family: "Helvetica Neue", "Arial", sans-serif + font-size: 14px + line-height: 18px + margin: 0 + padding: 0 + +#page, #login + background: #fafafa + padding: 1em 2em 3em + border-bottom: 1px solid #666 + @include box-shadow("0 1px 4px rgba(0, 0, 0, 0.3)") + +#login + width: 40em + margin: 5em auto 0 + +header + background: #333 + margin: -2.5em -2em 0 + #user + position: absolute + top: 1em + right: 2em + color: #ccc + a + color: #999 + h1 + font-size: 2em + margin-bottom: 0em + a + width: 263px + height: 24px + display: inline-block + padding: 1em 1em + text-indent: -1000em + background: url(/assets/admin/logo.png) 1em 0.75em no-repeat + &:hover + background-color: inherit + +#login + h1 + margin-bottom: 0.5em + +h2 + margin-top: 1.2em + +p, ol, ul, td + font-family: "Helvetica Neue", "Arial", sans-serif + font-size: 13px + line-height: 18px + +pre + background-color: #eee + padding: 10px + font-size: 11px + +a + color: #000 + &:hover + color: #fff + background-color: #000 + +div + &.field, &.actions + margin-bottom: 10px + +#notice + color: green + +.field_with_errors + padding: 2px + background-color: red + display: table + +table + border: 1px solid #bbb + border-spacing: 0 + @include box-shadow("0 2px 2px rgba(0, 0, 0, 0.2)") + @include round-corners(5px) + td, th + border-bottom: 1px solid #bbb + tr:nth-child(even) td + background: #f0f0f0 + tr:nth-child(odd) td + background: #fff + thead + background: #ddd + color: #333 + td, th + text-align: left + padding: 0.5em 0.7em + tfoot td + background: #ddd !important + border-bottom: 0 + +#error_explanation + width: 450px + border: 2px solid red + padding: 7px + padding-bottom: 0 + margin-bottom: 20px + background-color: #f0f0f0 + h2 + text-align: left + font-weight: bold + padding: 5px 5px 5px 15px + font-size: 12px + margin: -7px + margin-bottom: 0px + background-color: #c00 + color: #fff + ul li + font-size: 12px + list-style: square + +form ul.taxonomies + border: 1px solid #ccc + @include round-corners(3px) + @include box-shadow("inset 2px 2px 4px rgba(0, 0, 0, 0.1)") + margin-top: 1em + padding: 1em + width: 25% + float: right + > li + font-weight: bold \ No newline at end of file diff --git a/app/assets/stylesheets/admin/dashboard.css.sass b/app/assets/stylesheets/admin/dashboard.css.sass new file mode 100644 index 0000000..e84d552 --- /dev/null +++ b/app/assets/stylesheets/admin/dashboard.css.sass @@ -0,0 +1,3 @@ +// Place all the styles related to the admin/dashboard controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/admin/downloads.css.sass b/app/assets/stylesheets/admin/downloads.css.sass new file mode 100644 index 0000000..5b0ab4e --- /dev/null +++ b/app/assets/stylesheets/admin/downloads.css.sass @@ -0,0 +1,3 @@ +// Place all the styles related to the admin/downloads controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/admin/flash.css.sass b/app/assets/stylesheets/admin/flash.css.sass new file mode 100644 index 0000000..ac24321 --- /dev/null +++ b/app/assets/stylesheets/admin/flash.css.sass @@ -0,0 +1,14 @@ +.alert, .notice + border-style: solid + border-width: 2px 0 2px + padding: 0.7em 1.4em + +.alert + border-color: #993300 + background: #ffddcc + color: #662200 + +.notice + border-color: #339900 + background: #ddffcc + color: #226600 \ No newline at end of file diff --git a/app/assets/stylesheets/admin/formtastic.css.sass b/app/assets/stylesheets/admin/formtastic.css.sass new file mode 100644 index 0000000..9488232 --- /dev/null +++ b/app/assets/stylesheets/admin/formtastic.css.sass @@ -0,0 +1,103 @@ +@import "../includes/v_linear_grad" +@import "../includes/round_corners" +@import "../includes/transition" +@import "../includes/box_shadow" +@import "../includes/button" + +form.formtastic + background: white + border: 1px solid #ccc + margin: 0 0 1em + padding: 0 1em + @include box-shadow("0 2px 2px rgba(0, 0, 0, 0.05)") + label + text-align: right + margin-right: 1em + .required + label + font-weight: bold + @include round-corners(5px) + ol, ul + margin-bottom: 0.5em + .input + margin-bottom: 0em + margin-top: 0em + overflow: hidden + padding: 0.5em 0 + .label + width: 13em + textarea + height: 10em + input, textarea + font-family: "Helvetica Neue", "Arial", sans-serif + font-size: 1em + margin-right: 5px + border-width: 1px + border-style: solid + border-color: #999 #DDD #DDD #999 + padding: 0.3em + @include round-corners(2px) + @include box-shadow("inset 1px 1px 4px rgba(0, 0, 0, 0.1)") + &:focus + border-color: #67A #9AF #9AF #67A + @include box-shadow("0 0 4px rgba(0, 128, 255, 0.5), inset 1px 1px 4px rgba(0, 0, 0, 0.1)") + &[type=text], &[type=email] + width: 15em + &[type=number] + width: 3.5em + text-align: right + &:-webkit-inner-spin-button, &:-webkit-outer-spin-button + -webkit-appearance: none + margin: 0 + + input[type=submit], a.button + @include button + &[name=commit] + background-color: #9C7 + border-color: #370 + color: white + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.5) + @include box-shadow("0 1px 0 rgba(0, 0, 0, 0.25), inset -1px -1px 0 rgba(255, 255, 255, 0.2), inset 1px 1px 0 rgba(255, 255, 255, 0.3), inset 0 0 6px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.3)") + &:hover, &:focus + background-color: #8B6 + + .error input + border-width: 1px + border-style: solid + border-color: #933 #FBB #FBB #933 + background: #FFEFEF + padding: 3px + box-shadow: inset 1px 1px 4px rgba(0, 0, 0, 0.1) + + .inline-errors + display: inline + margin-left: 1em + color: #933 + + fieldset.inputs + padding: 1em 0 + border-bottom: 1px solid #ccc + fieldset.buttons + padding: 1.5em 0 1em + .stringish, .text + input, textarea + width: 40% + + .help + margin-left: 14em + margin-top: -0.5em + p + font-size: 0.8em + color: #999 + +a.button + @include button + +a.button.new + background-color: #7AC + border-color: #047 + color: white + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.5) + @include box-shadow("0 1px 0 rgba(0, 0, 0, 0.25), inset -1px -1px 0 rgba(255, 255, 255, 0.2), inset 1px 1px 0 rgba(255, 255, 255, 0.3), inset 0 0 6px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.3)") + &:hover, &:focus + background-color: #69B diff --git a/app/assets/stylesheets/admin/menu.css.sass b/app/assets/stylesheets/admin/menu.css.sass new file mode 100644 index 0000000..2082bbe --- /dev/null +++ b/app/assets/stylesheets/admin/menu.css.sass @@ -0,0 +1,47 @@ +@import "../includes/v_linear_grad" +@import "../includes/round_corners" +@import "../includes/transition" +@import "../includes/box_shadow" + +header + nav + ul + @include v-linear-grad(rgba(0,0,0,0), rgba(0,0,0,0.2)) + @include box-shadow("0 1px 0 rgba(0, 0, 0, 0.1), inset 0 -1px 0 rgba(255, 255, 255, 0.5)") + background-color: #DDD + border-style: solid + border-width: 0 0 1px 0 + border-color: #999 + color: white + margin: 0 + padding: 0 1em + list-style: none + height: 2.5em + li a + @include v-linear-grad(rgba(0,0,0,0), rgba(0,0,0,0.2)) + @include box-shadow("0 1px 0 rgba(0, 0, 0, 0.1), inset 0 -1px 0 rgba(255, 255, 255, 0.5)") + background-color: #DDD + color: #444 + text-decoration: none + display: block + height: 1.5em + float: left + padding: 0.6em 1em 0.4em + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) + @include transition(all 0.15s 0s ease) + &:hover, &:focus + @include v-linear-grad(rgba(0,0,0,0), rgba(0,0,0,0.2)) + @include box-shadow("0 1px 0 rgba(0, 0, 0, 0.1), inset 0 -1px 0 rgba(255, 255, 255, 0.5)") + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) + color: #444 + background-color: white + &:active + background-color: #ccc + &.selected + @include v-linear-grad(rgba(0,0,0,0.4), rgba(0,0,0,0)) + @include box-shadow("0 1px 0 rgba(0, 0, 0, 0.1), inset 0 -1px 0 rgba(255, 255, 255, 0.2), inset 0 0 6px rgba(0, 0, 0, 0.4)") + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.5) + background-color: #999 + color: white + &:hover + background-color: #aaa \ No newline at end of file diff --git a/app/assets/stylesheets/admin/unlocks.css.scss b/app/assets/stylesheets/admin/unlocks.css.scss new file mode 100644 index 0000000..a13ad4c --- /dev/null +++ b/app/assets/stylesheets/admin/unlocks.css.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the admin/unlocks controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css new file mode 100644 index 0000000..111bf27 --- /dev/null +++ b/app/assets/stylesheets/application.css @@ -0,0 +1,7 @@ +/* + * This is a manifest file that'll automatically include all the stylesheets available in this directory + * and any sub-directories. You're free to add application-wide styles to this file and they'll appear at + * the top of the compiled file, but it's generally better to create a new file per style scope. + *= require_self + *= require_directory ./application +*/ \ No newline at end of file diff --git a/app/assets/stylesheets/application/home.css.sass b/app/assets/stylesheets/application/home.css.sass new file mode 100644 index 0000000..f0ddc68 --- /dev/null +++ b/app/assets/stylesheets/application/home.css.sass @@ -0,0 +1,3 @@ +// Place all the styles related to the home controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/home.css.scss b/app/assets/stylesheets/home.css.scss new file mode 100644 index 0000000..f0ddc68 --- /dev/null +++ b/app/assets/stylesheets/home.css.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the home controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/includes/_box_shadow.sass b/app/assets/stylesheets/includes/_box_shadow.sass new file mode 100644 index 0000000..d8de3f6 --- /dev/null +++ b/app/assets/stylesheets/includes/_box_shadow.sass @@ -0,0 +1,4 @@ +@mixin box-shadow($value) + -webkit-box-shadow: unquote($value) + -moz-box-shadow: unquote($value) + box-shadow: unquote($value) \ No newline at end of file diff --git a/app/assets/stylesheets/includes/_button.sass b/app/assets/stylesheets/includes/_button.sass new file mode 100644 index 0000000..38c92e8 --- /dev/null +++ b/app/assets/stylesheets/includes/_button.sass @@ -0,0 +1,24 @@ +@mixin button + display: inline-block + position: relative + font-family: "Helvetica Neue", "Arial", sans-serif + font-size: 1em + text-decoration: none + padding: 0.3em 1em + @include v-linear-grad(rgba(0,0,0,0), rgba(0,0,0,0.2)) + @include box-shadow("0 1px 0 rgba(0, 0, 0, 0.25), inset -1px -1px 0 rgba(255, 255, 255, 0.5), inset 1px 1px 0 rgba(255, 255, 255, 0.6), inset 0 0 6px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.3)") + border-width: 1px + border-style: solid + border-color: #888 + background-color: white + color: #555 + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) + font-weight: bold + cursor: pointer + @include transition(all 0.15s 0s ease) + @include round-corners(3px) + &:hover, &:focus + background-color: #eee + color: #555 + &:active + top: 1px diff --git a/app/assets/stylesheets/includes/_round_corners.sass b/app/assets/stylesheets/includes/_round_corners.sass new file mode 100644 index 0000000..1ab96aa --- /dev/null +++ b/app/assets/stylesheets/includes/_round_corners.sass @@ -0,0 +1,5 @@ +@mixin round-corners($radius) + border-radius: $radius + -moz-border-radius: $radius + -webkit-border-radius: $radius + -o-border-radius: $radius diff --git a/app/assets/stylesheets/includes/_transition.sass b/app/assets/stylesheets/includes/_transition.sass new file mode 100644 index 0000000..94a2fb1 --- /dev/null +++ b/app/assets/stylesheets/includes/_transition.sass @@ -0,0 +1,5 @@ +@mixin transition($value) + -moz-transition: $value + -webkit-transition: $value + -o-transition: $value + transition: $value \ No newline at end of file diff --git a/app/assets/stylesheets/includes/_v_linear_grad.sass b/app/assets/stylesheets/includes/_v_linear_grad.sass new file mode 100644 index 0000000..0d401f6 --- /dev/null +++ b/app/assets/stylesheets/includes/_v_linear_grad.sass @@ -0,0 +1,7 @@ +@mixin v-linear-grad($from, $to) + background-image: -moz-linear-gradient(top, $from 0%, $to 100%) + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, $from), color-stop(100%, $to)) + background-image: -webkit-linear-gradient(top, $from 0%, $to 100%) + background-image: -o-linear-gradient(top, $from 0%, $to 100%) + background-image: -ms-linear-gradient(top, $from 0%, $to 100%) + background-image: linear-gradient(top, $from 0%, $to 100%) diff --git a/app/controllers/admin/admin_controller.rb b/app/controllers/admin/admin_controller.rb new file mode 100644 index 0000000..3e6fd83 --- /dev/null +++ b/app/controllers/admin/admin_controller.rb @@ -0,0 +1,4 @@ +class Admin::AdminController < ApplicationController + layout 'admin/layouts/admin' + before_filter :authenticate_admin_user! +end diff --git a/app/controllers/admin/admin_users_controller.rb b/app/controllers/admin/admin_users_controller.rb new file mode 100644 index 0000000..96367c1 --- /dev/null +++ b/app/controllers/admin/admin_users_controller.rb @@ -0,0 +1,69 @@ +class Admin::AdminUsersController < Admin::AdminController + + def index + @admin_users = AdminUser.all + end + + def new + @admin_user = AdminUser.new + end + + def edit + @admin_user = AdminUser.find(params[:id]) + end + + def update + @admin_user = AdminUser.find(params[:id]) + + respond_to do |format| + if @admin_user.update_attributes(params[:admin_user]) + format.html { redirect_to(admin_admin_users_path, :notice => 'Admin User was successfully updated.') } + format.xml { head :ok } + else + format.html { render :action => "edit" } + format.xml { render :xml => @admin_user.errors, :status => :unprocessable_entity } + end + end + end + + def create + @admin_user = AdminUser.new(params[:admin_user]) + + respond_to do |format| + if @admin_user.save + format.html { redirect_to(admin_admin_users_path, :notice => 'Admin User was successfully added.') } + format.xml { head :ok } + else + format.html { render :action => "edit" } + format.xml { render :xml => @admin_user.errors, :status => :unprocessable_entity } + end + end + end + + def destroy + @admin_user = AdminUser.find(params[:id]) + @admin_user.destroy + + respond_to do |format| + format.html { redirect_to(admin_admin_users_path, :notice => 'Admin User was deleted.') } + format.xml { head :ok } + end + end + + # Allow the current logged in user to change their password + def edit_password + @admin_user = current_admin_user + end + + def update_password + @admin_user = current_admin_user + + if @admin_user.update_with_password(params[:admin_user]) + sign_in(@admin_user, :bypass => true) + redirect_to admin_enterprises_path, :notice => "Password updated!" + else + render :edit_password + end + end + +end diff --git a/app/controllers/admin/confirmations_controller.rb b/app/controllers/admin/confirmations_controller.rb new file mode 100644 index 0000000..1561fa2 --- /dev/null +++ b/app/controllers/admin/confirmations_controller.rb @@ -0,0 +1,60 @@ +class Admin::ConfirmationsController < ::Devise::PasswordsController + layout "admin/layouts/login" + + skip_before_filter(:authenticate_user!) + # PUT /resource/confirmation + def update + with_unconfirmed_confirmable do + if @confirmable.has_no_password? + @confirmable.attempt_set_password(params[:admin_user]) + if @confirmable.valid? + do_confirm + else + do_show + @confirmable.errors.clear #so that we wont render :new + end + else + self.class.add_error_on(self, :email, :password_allready_set) + end + end + + if !@confirmable.errors.empty? + render_with_scope :new + end + end + + # GET /resource/confirmation?confirmation_token=abcdef + def show + with_unconfirmed_confirmable do + if @confirmable.has_no_password? + do_show + else + do_confirm + end + end + if !@confirmable.errors.empty? + render_with_scope :new + end + end + + protected + def with_unconfirmed_confirmable + @confirmable = AdminUser.find_or_initialize_with_error_by(:confirmation_token, params[:confirmation_token]) + if !@confirmable.new_record? + @confirmable.only_if_unconfirmed {yield} + end + end + + def do_show + @confirmation_token = params[:confirmation_token] + @requires_password = true + self.resource = @confirmable + render_with_scope :show + end + + def do_confirm + @confirmable.confirm! + set_flash_message :notice, :confirmed + sign_in_and_redirect(resource_name, @confirmable) + end +end \ No newline at end of file diff --git a/app/controllers/admin/dashboard_controller.rb b/app/controllers/admin/dashboard_controller.rb new file mode 100644 index 0000000..a4ecb27 --- /dev/null +++ b/app/controllers/admin/dashboard_controller.rb @@ -0,0 +1,2 @@ +class Admin::DashboardController < Admin::AdminController +end diff --git a/app/controllers/admin/passwords_controller.rb b/app/controllers/admin/passwords_controller.rb new file mode 100644 index 0000000..1fdcc20 --- /dev/null +++ b/app/controllers/admin/passwords_controller.rb @@ -0,0 +1,3 @@ +class Admin::PasswordsController < ::Devise::PasswordsController + layout "admin/layouts/login" +end diff --git a/app/controllers/admin/registrations_controller.rb b/app/controllers/admin/registrations_controller.rb new file mode 100644 index 0000000..c8d47ad --- /dev/null +++ b/app/controllers/admin/registrations_controller.rb @@ -0,0 +1,3 @@ +class Admin::RegistrationsController < ::Devise::RegistrationsController + layout "admin/layouts/login" +end diff --git a/app/controllers/admin/sessions_controller.rb b/app/controllers/admin/sessions_controller.rb new file mode 100644 index 0000000..02c3808 --- /dev/null +++ b/app/controllers/admin/sessions_controller.rb @@ -0,0 +1,3 @@ +class Admin::SessionsController < ::Devise::SessionsController + layout "admin/layouts/login" +end \ No newline at end of file diff --git a/app/controllers/admin/unlocks_controller.rb b/app/controllers/admin/unlocks_controller.rb new file mode 100644 index 0000000..a399b7d --- /dev/null +++ b/app/controllers/admin/unlocks_controller.rb @@ -0,0 +1,3 @@ +class Admin::UnlocksController < ::Devise::UnlocksController + layout "admin/layouts/login" +end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb new file mode 100644 index 0000000..b2544fc --- /dev/null +++ b/app/controllers/application_controller.rb @@ -0,0 +1,12 @@ +class ApplicationController < ActionController::Base + protect_from_forgery + + def after_sign_in_path_for(resource_or_scope) + admin_dashboard_path + end + + def after_sign_out_path_for(resource_or_scope) + new_admin_user_session_path + end + +end diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb new file mode 100644 index 0000000..95f2992 --- /dev/null +++ b/app/controllers/home_controller.rb @@ -0,0 +1,4 @@ +class HomeController < ApplicationController + def index + end +end diff --git a/app/helpers/admin/admin_helper.rb b/app/helpers/admin/admin_helper.rb new file mode 100644 index 0000000..53c4d49 --- /dev/null +++ b/app/helpers/admin/admin_helper.rb @@ -0,0 +1,2 @@ +module Admin::AdminHelper +end diff --git a/app/helpers/admin/dashboard_helper.rb b/app/helpers/admin/dashboard_helper.rb new file mode 100644 index 0000000..4052b7c --- /dev/null +++ b/app/helpers/admin/dashboard_helper.rb @@ -0,0 +1,2 @@ +module Admin::DashboardHelper +end diff --git a/app/helpers/admin/downloads_helper.rb b/app/helpers/admin/downloads_helper.rb new file mode 100644 index 0000000..5d6e8d9 --- /dev/null +++ b/app/helpers/admin/downloads_helper.rb @@ -0,0 +1,2 @@ +module Admin::DownloadsHelper +end diff --git a/app/helpers/admin/unlocks_helper.rb b/app/helpers/admin/unlocks_helper.rb new file mode 100644 index 0000000..3367487 --- /dev/null +++ b/app/helpers/admin/unlocks_helper.rb @@ -0,0 +1,2 @@ +module Admin::UnlocksHelper +end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb new file mode 100644 index 0000000..de6be79 --- /dev/null +++ b/app/helpers/application_helper.rb @@ -0,0 +1,2 @@ +module ApplicationHelper +end diff --git a/app/helpers/home_helper.rb b/app/helpers/home_helper.rb new file mode 100644 index 0000000..23de56a --- /dev/null +++ b/app/helpers/home_helper.rb @@ -0,0 +1,2 @@ +module HomeHelper +end diff --git a/app/mailers/.gitkeep b/app/mailers/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/app/models/.gitkeep b/app/models/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/app/models/admin_user.rb b/app/models/admin_user.rb new file mode 100644 index 0000000..d74ea3d --- /dev/null +++ b/app/models/admin_user.rb @@ -0,0 +1,36 @@ +class AdminUser < ActiveRecord::Base + # Include default devise modules. Others available are: + # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable + devise :database_authenticatable, :confirmable, + :recoverable, :rememberable, :trackable, :validatable, :lockable + + # Setup accessible (or protected) attributes for your model + attr_accessible :email, :password, :password_confirmation, :remember_me + + # new function to set the password without knowing the current password used in our confirmation controller. + def attempt_set_password(params) + p = {} + p[:password] = params[:password] + p[:password_confirmation] = params[:password_confirmation] + update_attributes(p) + end + + # new function to return whether a password has been set + def has_no_password? + self.encrypted_password.blank? + end + + # new function to provide access to protected method unless_confirmed + def only_if_unconfirmed + unless_confirmed {yield} + end + + def password_required? + # Password is required if it is being set, but not for new records + if !persisted? + false + else + !password.nil? || !password_confirmation.nil? + end + end +end diff --git a/app/views/admin/admin_users/_admin_user.html.haml b/app/views/admin/admin_users/_admin_user.html.haml new file mode 100644 index 0000000..c18c7b8 --- /dev/null +++ b/app/views/admin/admin_users/_admin_user.html.haml @@ -0,0 +1,7 @@ +%tr + %td= admin_user.email + %td= admin_user.last_sign_in_at + %td= admin_user.last_sign_in_ip + %td{ :class => :actions } + - unless admin_user == current_admin_user + = link_to "Delete", admin_admin_user_path(admin_user), :method => :delete, :confirm => "Are you sure you wish to delete this Admin User?" \ No newline at end of file diff --git a/app/views/admin/admin_users/_form.html.haml b/app/views/admin/admin_users/_form.html.haml new file mode 100644 index 0000000..0fed776 --- /dev/null +++ b/app/views/admin/admin_users/_form.html.haml @@ -0,0 +1,3 @@ += semantic_form_for [:admin, admin_user] do |f| + = f.inputs :email + = f.buttons \ No newline at end of file diff --git a/app/views/admin/admin_users/edit.html.haml b/app/views/admin/admin_users/edit.html.haml new file mode 100644 index 0000000..3ace240 --- /dev/null +++ b/app/views/admin/admin_users/edit.html.haml @@ -0,0 +1,2 @@ +%h2 Edit Admin User += render :partial => "form", :locals => { :admin_user => @admin_user } \ No newline at end of file diff --git a/app/views/admin/admin_users/edit_password.html.haml b/app/views/admin/admin_users/edit_password.html.haml new file mode 100644 index 0000000..546dd0c --- /dev/null +++ b/app/views/admin/admin_users/edit_password.html.haml @@ -0,0 +1,11 @@ +%h3 Change your password + += semantic_form_for(@admin_user, :url => update_password_admin_admin_user_path, :html => { :method => :put }) do |f| + = f.inputs do + = f.input :current_password + = f.inputs do + = f.input :password, :label => "New Password" + = f.input :password_confirmation, :label => "Confirm Password" + + = f.buttons do + = f.submit "Change my password" diff --git a/app/views/admin/admin_users/index.html.haml b/app/views/admin/admin_users/index.html.haml new file mode 100644 index 0000000..6c31788 --- /dev/null +++ b/app/views/admin/admin_users/index.html.haml @@ -0,0 +1,16 @@ +%h2 Admin Users + +%table + %thead + %tr + %th Email + %th Last Signed In? + %th IP Address + %th + %tbody + = render :partial => "admin_user", :collection => @admin_users + %tfoot + %tr + %td{:colspan => 4} +%br/ += link_to 'New Admin User', new_admin_admin_user_path, :class => [:button, :new] diff --git a/app/views/admin/admin_users/new.html.haml b/app/views/admin/admin_users/new.html.haml new file mode 100644 index 0000000..68e75bd --- /dev/null +++ b/app/views/admin/admin_users/new.html.haml @@ -0,0 +1,2 @@ +%h2 New Admin User += render :partial => "form", :locals => { :admin_user => @admin_user } \ No newline at end of file diff --git a/app/views/admin/confirmations/new.html.haml b/app/views/admin/confirmations/new.html.haml new file mode 100644 index 0000000..e3e870b --- /dev/null +++ b/app/views/admin/confirmations/new.html.haml @@ -0,0 +1,11 @@ +%h3 Resend confirmation instructions + += semantic_form_for(resource, :as => resource_name, :url => confirmation_path(resource_name), :html => { :method => :post }) do |f| + + = f.inputs do + = f.input :email + + = f.buttons do + = f.submit "Resend confirmation instructions" + += render :partial => "devise/shared/links" diff --git a/app/views/admin/confirmations/show.html.haml b/app/views/admin/confirmations/show.html.haml new file mode 100644 index 0000000..99d5bb4 --- /dev/null +++ b/app/views/admin/confirmations/show.html.haml @@ -0,0 +1,11 @@ += semantic_form_for resource, :as => resource_name, :url => update_user_confirmation_path, :html => {:method => 'put'}, :id => 'activation-form' do |f| + = devise_error_messages! + = field_set_tag "", :class => "inputs" do + %h3= "Account Activation for #{resource.email}" + %ol + - if @requires_password + = f.input :password, :label => 'Choose a Password' + = f.input :password_confirmation, :label => 'Confirm Password' + = hidden_field_tag :confirmation_token,@confirmation_token + = f.buttons do + = f.submit "Activate" diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml new file mode 100644 index 0000000..22f9e2d --- /dev/null +++ b/app/views/admin/dashboard/index.html.haml @@ -0,0 +1 @@ +%p This is the admin dashboard. \ No newline at end of file diff --git a/app/views/admin/layouts/admin.html.haml b/app/views/admin/layouts/admin.html.haml new file mode 100644 index 0000000..4d3f230 --- /dev/null +++ b/app/views/admin/layouts/admin.html.haml @@ -0,0 +1,14 @@ +!!! +%html + %head + %title Pixelhum Admin + = stylesheet_link_tag "admin" + = javascript_include_tag "admin" + = csrf_meta_tag + + %body + #page + %header{ :role => "banner" }= render :partial => "admin/shared/header" + = render :partial => "shared/flash_messages" + = yield + %footer{ :role => "footer" }= render :partial => "admin/shared/footer" \ No newline at end of file diff --git a/app/views/admin/layouts/login.html.haml b/app/views/admin/layouts/login.html.haml new file mode 100644 index 0000000..589b05c --- /dev/null +++ b/app/views/admin/layouts/login.html.haml @@ -0,0 +1,13 @@ +!!! +%html + %head + %title Pixelhum Admin + = stylesheet_link_tag "admin" + = javascript_include_tag "admin" + = csrf_meta_tag + + %body + #login + %header{ :role => "banner" }= render :partial => "admin/shared/login_header" + = render :partial => "shared/flash_messages" + = yield \ No newline at end of file diff --git a/app/views/admin/passwords/edit.html.haml b/app/views/admin/passwords/edit.html.haml new file mode 100644 index 0000000..2016bb0 --- /dev/null +++ b/app/views/admin/passwords/edit.html.haml @@ -0,0 +1,14 @@ +%h3 Change your password + += semantic_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.inputs do + = f.input :password, :label => "New Password" + = f.input :password_confirmation, :label => "Confirm Password" + + = f.buttons do + = f.submit "Change my password" + += render :partial => "devise/shared/links" \ No newline at end of file diff --git a/app/views/admin/passwords/new.html.haml b/app/views/admin/passwords/new.html.haml new file mode 100644 index 0000000..1614978 --- /dev/null +++ b/app/views/admin/passwords/new.html.haml @@ -0,0 +1,11 @@ +%h3 Forgot your password? + += semantic_form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :post }) do |f| + + = f.inputs do + = f.input :email + + = f.buttons do + = f.submit "Reset Password" + += render :partial => "devise/shared/links" \ No newline at end of file diff --git a/app/views/admin/sessions/new.html.haml b/app/views/admin/sessions/new.html.haml new file mode 100644 index 0000000..b1166d9 --- /dev/null +++ b/app/views/admin/sessions/new.html.haml @@ -0,0 +1,14 @@ +%h3 Sign in + += semantic_form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| + = f.inputs do + = f.input :email + = f.input :password + + - if devise_mapping.rememberable? + = f.input :remember_me, :as => :boolean + + = f.buttons do + = f.submit "Sign In" + += render :partial => "devise/shared/links" \ No newline at end of file diff --git a/app/views/admin/shared/_footer.html.haml b/app/views/admin/shared/_footer.html.haml new file mode 100644 index 0000000..e69de29 diff --git a/app/views/admin/shared/_header.html.haml b/app/views/admin/shared/_header.html.haml new file mode 100644 index 0000000..0d917fc --- /dev/null +++ b/app/views/admin/shared/_header.html.haml @@ -0,0 +1,3 @@ +%h1= link_to "Abiquo Downloads", admin_dashboard_path += render :partial => "admin/shared/user" += render :partial => "admin/shared/menu" \ No newline at end of file diff --git a/app/views/admin/shared/_login_header.html.haml b/app/views/admin/shared/_login_header.html.haml new file mode 100644 index 0000000..74be139 --- /dev/null +++ b/app/views/admin/shared/_login_header.html.haml @@ -0,0 +1 @@ +%h1= link_to "Abiquo Downloads", admin_dashboard_path diff --git a/app/views/admin/shared/_menu.html.haml b/app/views/admin/shared/_menu.html.haml new file mode 100644 index 0000000..3d8f084 --- /dev/null +++ b/app/views/admin/shared/_menu.html.haml @@ -0,0 +1,4 @@ +%nav + %ul + %li= link_to "Dashboard", admin_dashboard_path, :class => (params[:controller] == "admin/dashboard" ? "selected" : nil) + %li= link_to "Admin Users", admin_admin_users_path, :class => (params[:controller] == "admin/admin_users" ? "selected" : nil) diff --git a/app/views/admin/shared/_user.html.haml b/app/views/admin/shared/_user.html.haml new file mode 100644 index 0000000..356ba33 --- /dev/null +++ b/app/views/admin/shared/_user.html.haml @@ -0,0 +1,6 @@ +#user + %strong= current_admin_user.email + //| + //= link_to "Change Password", edit_password_admin_admin_user_path + | + = link_to "Logout", destroy_admin_user_session_path, :method => :delete \ No newline at end of file diff --git a/app/views/admin/unlocks/new.html.haml b/app/views/admin/unlocks/new.html.haml new file mode 100644 index 0000000..43256b7 --- /dev/null +++ b/app/views/admin/unlocks/new.html.haml @@ -0,0 +1,11 @@ +%h3 Resend unlock instructions + += semantic_form_for(resource, :as => resource_name, :url => unlock_path(resource_name), :html => { :method => :post }) do |f| + + = f.inputs do + = f.input :email + + = f.buttons do + = f.submit "Resend unlock instructions" + += render :partial => "devise/shared/links" diff --git a/app/views/home/index.html.haml b/app/views/home/index.html.haml new file mode 100644 index 0000000..3c8caf4 --- /dev/null +++ b/app/views/home/index.html.haml @@ -0,0 +1 @@ +%h1 Template App \ No newline at end of file diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb new file mode 100644 index 0000000..c2d7009 --- /dev/null +++ b/app/views/layouts/application.html.erb @@ -0,0 +1,14 @@ + + + + Abidownloads + <%= stylesheet_link_tag "application" %> + <%= javascript_include_tag "application" %> + <%= csrf_meta_tags %> + + + +<%= yield %> + + + diff --git a/app/views/shared/_banner.html.haml b/app/views/shared/_banner.html.haml new file mode 100644 index 0000000..2597466 --- /dev/null +++ b/app/views/shared/_banner.html.haml @@ -0,0 +1,2 @@ +%header{:role => :banner} + %h1 Abiquo Downloads \ No newline at end of file diff --git a/app/views/shared/_flash_messages.html.haml b/app/views/shared/_flash_messages.html.haml new file mode 100644 index 0000000..63b1f4e --- /dev/null +++ b/app/views/shared/_flash_messages.html.haml @@ -0,0 +1,5 @@ +- if !flash[:notice].blank? + %p.notice= flash[:notice] + +- if !flash[:alert].blank? + %p.alert= flash[:alert] \ No newline at end of file diff --git a/config.ru b/config.ru new file mode 100644 index 0000000..7e9af2e --- /dev/null +++ b/config.ru @@ -0,0 +1,4 @@ +# This file is used by Rack-based servers to start the application. + +require ::File.expand_path('../config/environment', __FILE__) +run Abidownloads::Application diff --git a/config/application.rb b/config/application.rb new file mode 100644 index 0000000..0aaa3c7 --- /dev/null +++ b/config/application.rb @@ -0,0 +1,48 @@ +require File.expand_path('../boot', __FILE__) + +require 'rails/all' + +if defined?(Bundler) + # If you precompile assets before deploying to production, use this line + Bundler.require *Rails.groups(:assets => %w(development test)) + # If you want your assets lazily compiled in production, use this line + # Bundler.require(:default, :assets, Rails.env) +end + +module Abidownloads + class Application < Rails::Application + # Settings in config/environments/* take precedence over those specified here. + # Application configuration should go into files in config/initializers + # -- all .rb files in that directory are automatically loaded. + + # Custom directories with classes and modules you want to be autoloadable. + # config.autoload_paths += %W(#{config.root}/extras) + + # Only load the plugins named here, in the order given (default is alphabetical). + # :all can be used as a placeholder for all plugins not explicitly named. + # config.plugins = [ :exception_notification, :ssl_requirement, :all ] + + # Activate observers that should always be running. + # config.active_record.observers = :cacher, :garbage_collector, :forum_observer + + # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. + # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. + # config.time_zone = 'Central Time (US & Canada)' + + # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. + # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] + # config.i18n.default_locale = :de + + # Configure the default encoding used in templates for Ruby 1.9. + config.encoding = "utf-8" + + # Configure sensitive parameters which will be filtered from the log file. + config.filter_parameters += [:password] + + # Enable the asset pipeline + config.assets.enabled = true + + # Version of your assets, change this if you want to expire all your assets + config.assets.version = '1.0' + end +end diff --git a/config/boot.rb b/config/boot.rb new file mode 100644 index 0000000..4489e58 --- /dev/null +++ b/config/boot.rb @@ -0,0 +1,6 @@ +require 'rubygems' + +# Set up gems listed in the Gemfile. +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) + +require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE']) diff --git a/config/environment.rb b/config/environment.rb new file mode 100644 index 0000000..0fce148 --- /dev/null +++ b/config/environment.rb @@ -0,0 +1,5 @@ +# Load the rails application +require File.expand_path('../application', __FILE__) + +# Initialize the rails application +Abidownloads::Application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb new file mode 100644 index 0000000..063bdf6 --- /dev/null +++ b/config/environments/development.rb @@ -0,0 +1,44 @@ +Abidownloads::Application.configure do + # Settings specified here will take precedence over those in config/application.rb + + # In the development environment your application's code is reloaded on + # every request. This slows down response time but is perfect for development + # since you don't have to restart the web server when you make code changes. + config.cache_classes = false + + # Log error messages when you accidentally call methods on nil. + config.whiny_nils = true + + # Show full error reports and disable caching + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + + # Don't care if the mailer can't send + config.action_mailer.raise_delivery_errors = false + + # Print deprecation notices to the Rails logger + config.active_support.deprecation = :log + + # Only use best-standards-support built into browsers + config.action_dispatch.best_standards_support = :builtin + + # Do not compress assets + config.assets.compress = false + + # Expands the lines which load the assets + config.assets.debug = true + + config.action_mailer.delivery_method = :smtp + config.action_mailer.smtp_settings = { + :address => "smtp.gmail.com", + :port => 587, + :domain => 'example.com', + :user_name => 'webapps@example.com', + :password => 'password', + :authentication => 'plain', + :enable_starttls_auto => true + } + + config.action_mailer.default_url_options = { :host => "abidownloads.dev" } + +end diff --git a/config/environments/production.rb b/config/environments/production.rb new file mode 100644 index 0000000..833091c --- /dev/null +++ b/config/environments/production.rb @@ -0,0 +1,74 @@ +Abidownloads::Application.configure do + # Settings specified here will take precedence over those in config/application.rb + + # Code is not reloaded between requests + config.cache_classes = true + + # Full error reports are disabled and caching is turned on + config.consider_all_requests_local = false + config.action_controller.perform_caching = true + + # Disable Rails's static asset server (Apache or nginx will already do this) + config.serve_static_assets = false + + # Compress JavaScripts and CSS + config.assets.compress = true + + # Don't fallback to assets pipeline if a precompiled asset is missed + config.assets.compile = false + + # Generate digests for assets URLs + config.assets.digest = true + + # Defaults to Rails.root.join("public/assets") + # config.assets.manifest = YOUR_PATH + + # Specifies the header that your server uses for sending files + # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache + # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx + + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. + # config.force_ssl = true + + # See everything in the log (default is :info) + # config.log_level = :debug + + # Use a different logger for distributed setups + # config.logger = SyslogLogger.new + + # Use a different cache store in production + # config.cache_store = :mem_cache_store + + # Enable serving of images, stylesheets, and JavaScripts from an asset server + # config.action_controller.asset_host = "http://assets.example.com" + + # Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added) + # config.assets.precompile += %w( search.js ) + + # Disable delivery errors, bad email addresses will be ignored + # config.action_mailer.raise_delivery_errors = false + + # Enable threaded mode + # config.threadsafe! + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation can not be found) + config.i18n.fallbacks = true + + # Send deprecation notices to registered listeners + config.active_support.deprecation = :notify + + # Settings for Sendgrid Free on Heroku + ActionMailer::Base.smtp_settings = { + :address => 'smtp.sendgrid.net', + :port => '587', + :authentication => :plain, + :user_name => ENV['SENDGRID_USERNAME'], + :password => ENV['SENDGRID_PASSWORD'], + :domain => 'heroku.com' + } + ActionMailer::Base.delivery_method = :smtp + + config.action_mailer.default_url_options = { :host => "abidownloads.herokuapp.com" } + +end diff --git a/config/environments/test.rb b/config/environments/test.rb new file mode 100644 index 0000000..6346c1c --- /dev/null +++ b/config/environments/test.rb @@ -0,0 +1,42 @@ +Abidownloads::Application.configure do + # Settings specified here will take precedence over those in config/application.rb + + # The test environment is used exclusively to run your application's + # test suite. You never need to work with it otherwise. Remember that + # your test database is "scratch space" for the test suite and is wiped + # and recreated between test runs. Don't rely on the data there! + config.cache_classes = true + + # Configure static asset server for tests with Cache-Control for performance + config.serve_static_assets = true + config.static_cache_control = "public, max-age=3600" + + # Log error messages when you accidentally call methods on nil + config.whiny_nils = true + + # Show full error reports and disable caching + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + + # Raise exceptions instead of rendering exception templates + config.action_dispatch.show_exceptions = false + + # Disable request forgery protection in test environment + config.action_controller.allow_forgery_protection = false + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Use SQL instead of Active Record's schema dumper when creating the test database. + # This is necessary if your schema can't be completely dumped by the schema dumper, + # like if you have constraints or database-specific column types + # config.active_record.schema_format = :sql + + # Print deprecation notices to the stderr + config.active_support.deprecation = :stderr + + # Allow pass debug_assets=true as a query parameter to load pages with unpackaged assets + config.assets.allow_debugging = true +end diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb new file mode 100644 index 0000000..59385cd --- /dev/null +++ b/config/initializers/backtrace_silencers.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. +# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } + +# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. +# Rails.backtrace_cleaner.remove_silencers! diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb new file mode 100644 index 0000000..e6289c4 --- /dev/null +++ b/config/initializers/devise.rb @@ -0,0 +1,210 @@ +# Use this hook to configure devise mailer, warden hooks and so forth. The first +# four configuration values can also be set straight in your models. +Devise.setup do |config| + # ==> Mailer Configuration + # Configure the e-mail address which will be shown in Devise::Mailer, + # note that it will be overwritten if you use your own mailer class with default "from" parameter. + config.mailer_sender = "please-change-me-at-config-initializers-devise@example.com" + + # Configure the class responsible to send e-mails. + # config.mailer = "Devise::Mailer" + + # ==> ORM configuration + # Load and configure the ORM. Supports :active_record (default) and + # :mongoid (bson_ext recommended) by default. Other ORMs may be + # available as additional gems. + require 'devise/orm/active_record' + + # ==> Configuration for any authentication mechanism + # Configure which keys are used when authenticating a user. The default is + # just :email. You can configure it to use [:username, :subdomain], so for + # authenticating a user, both parameters are required. Remember that those + # parameters are used only when authenticating and not when retrieving from + # session. If you need permissions, you should implement that in a before filter. + # You can also supply a hash where the value is a boolean determining whether + # or not authentication should be aborted when the value is not present. + # config.authentication_keys = [ :email ] + + # Configure parameters from the request object used for authentication. Each entry + # given should be a request method and it will automatically be passed to the + # find_for_authentication method and considered in your model lookup. For instance, + # if you set :request_keys to [:subdomain], :subdomain will be used on authentication. + # The same considerations mentioned for authentication_keys also apply to request_keys. + # config.request_keys = [] + + # Configure which authentication keys should be case-insensitive. + # These keys will be downcased upon creating or modifying a user and when used + # to authenticate or find a user. Default is :email. + config.case_insensitive_keys = [ :email ] + + # Configure which authentication keys should have whitespace stripped. + # These keys will have whitespace before and after removed upon creating or + # modifying a user and when used to authenticate or find a user. Default is :email. + config.strip_whitespace_keys = [ :email ] + + # Tell if authentication through request.params is enabled. True by default. + # config.params_authenticatable = true + + # Tell if authentication through HTTP Basic Auth is enabled. False by default. + # config.http_authenticatable = false + + # If http headers should be returned for AJAX requests. True by default. + # config.http_authenticatable_on_xhr = true + + # The realm used in Http Basic Authentication. "Application" by default. + # config.http_authentication_realm = "Application" + + # It will change confirmation, password recovery and other workflows + # to behave the same regardless if the e-mail provided was right or wrong. + # Does not affect registerable. + # config.paranoid = true + + # ==> Configuration for :database_authenticatable + # For bcrypt, this is the cost for hashing the password and defaults to 10. If + # using other encryptors, it sets how many times you want the password re-encrypted. + # + # Limiting the stretches to just one in testing will increase the performance of + # your test suite dramatically. However, it is STRONGLY RECOMMENDED to not use + # a value less than 10 in other environments. + config.stretches = Rails.env.test? ? 1 : 10 + + # Setup a pepper to generate the encrypted password. + # config.pepper = "09f42a4393b21d179831660ef0102527e36691cfe7d0d72f2b23c0b712275223dbca9eced7e781dcb6cbb14f129aed2086c91ab8bb38c519321a61fb1a93c170" + + # ==> Configuration for :confirmable + # A period that the user is allowed to access the website even without + # confirming his account. For instance, if set to 2.days, the user will be + # able to access the website for two days without confirming his account, + # access will be blocked just in the third day. Default is 0.days, meaning + # the user cannot access the website without confirming his account. + # config.confirm_within = 2.days + + # Defines which key will be used when confirming an account + # config.confirmation_keys = [ :email ] + + # ==> Configuration for :rememberable + # The time the user will be remembered without asking for credentials again. + # config.remember_for = 2.weeks + + # If true, a valid remember token can be re-used between multiple browsers. + # config.remember_across_browsers = true + + # If true, extends the user's remember period when remembered via cookie. + # config.extend_remember_period = false + + # If true, uses the password salt as remember token. This should be turned + # to false if you are not using database authenticatable. + config.use_salt_as_remember_token = true + + # Options to be passed to the created cookie. For instance, you can set + # :secure => true in order to force SSL only cookies. + # config.cookie_options = {} + + # ==> Configuration for :validatable + # Range for password length. Default is 6..128. + # config.password_length = 6..128 + + # Email regex used to validate email formats. It simply asserts that + # an one (and only one) @ exists in the given string. This is mainly + # to give user feedback and not to assert the e-mail validity. + # config.email_regexp = /\A[^@]+@[^@]+\z/ + + # ==> Configuration for :timeoutable + # The time you want to timeout the user session without activity. After this + # time the user will be asked for credentials again. Default is 30 minutes. + # config.timeout_in = 30.minutes + + # ==> Configuration for :lockable + # Defines which strategy will be used to lock an account. + # :failed_attempts = Locks an account after a number of failed attempts to sign in. + # :none = No lock strategy. You should handle locking by yourself. + config.lock_strategy = :failed_attempts + + # Defines which key will be used when locking and unlocking an account + # config.unlock_keys = [ :email ] + + # Defines which strategy will be used to unlock an account. + # :email = Sends an unlock link to the user email + # :time = Re-enables login after a certain amount of time (see :unlock_in below) + # :both = Enables both strategies + # :none = No unlock strategy. You should handle unlocking by yourself. + # config.unlock_strategy = :both + + # Number of authentication tries before locking an account if lock_strategy + # is failed attempts. + config.maximum_attempts = 5 + + # Time interval to unlock the account if :time is enabled as unlock_strategy. + # config.unlock_in = 1.hour + + # ==> Configuration for :recoverable + # + # Defines which key will be used when recovering the password for an account + # config.reset_password_keys = [ :email ] + + # Time interval you can reset your password with a reset password key. + # Don't put a too small interval or your users won't have the time to + # change their passwords. + config.reset_password_within = 2.hours + + # ==> Configuration for :encryptable + # Allow you to use another encryption algorithm besides bcrypt (default). You can use + # :sha1, :sha512 or encryptors from others authentication tools as :clearance_sha1, + # :authlogic_sha512 (then you should set stretches above to 20 for default behavior) + # and :restful_authentication_sha1 (then you should set stretches to 10, and copy + # REST_AUTH_SITE_KEY to pepper) + # config.encryptor = :sha512 + + # ==> Configuration for :token_authenticatable + # Defines name of the authentication token params key + # config.token_authentication_key = :auth_token + + # If true, authentication through token does not store user in session and needs + # to be supplied on each request. Useful if you are using the token as API token. + # config.stateless_token = false + + # ==> Scopes configuration + # Turn scoped views on. Before rendering "sessions/new", it will first check for + # "users/sessions/new". It's turned off by default because it's slower if you + # are using only default views. + # config.scoped_views = false + + # Configure the default scope given to Warden. By default it's the first + # devise role declared in your routes (usually :user). + # config.default_scope = :user + + # Configure sign_out behavior. + # Sign_out action can be scoped (i.e. /users/sign_out affects only :user scope). + # The default is true, which means any logout action will sign out all active scopes. + # config.sign_out_all_scopes = true + + # ==> Navigation configuration + # Lists the formats that should be treated as navigational. Formats like + # :html, should redirect to the sign in page when the user does not have + # access, but formats like :xml or :json, should return 401. + # + # If you have any extra navigational formats, like :iphone or :mobile, you + # should add them to the navigational formats lists. + # + # The :"*/*" and "*/*" formats below is required to match Internet + # Explorer requests. + # config.navigational_formats = [:"*/*", "*/*", :html] + + # The default HTTP method used to sign out a resource. Default is :delete. + config.sign_out_via = :delete + + # ==> OmniAuth + # Add a new OmniAuth provider. Check the wiki for more information on setting + # up on your models and hooks. + # config.omniauth :github, 'APP_ID', 'APP_SECRET', :scope => 'user,public_repo' + + # ==> Warden configuration + # If you want to use other strategies, that are not supported by Devise, or + # change the failure app, you can configure them inside the config.warden block. + # + # config.warden do |manager| + # manager.failure_app = AnotherApp + # manager.intercept_401 = false + # manager.default_strategies(:scope => :user).unshift :some_external_strategy + # end +end diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb new file mode 100644 index 0000000..9e8b013 --- /dev/null +++ b/config/initializers/inflections.rb @@ -0,0 +1,10 @@ +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format +# (all these examples are active by default): +# ActiveSupport::Inflector.inflections do |inflect| +# inflect.plural /^(ox)$/i, '\1en' +# inflect.singular /^(ox)en/i, '\1' +# inflect.irregular 'person', 'people' +# inflect.uncountable %w( fish sheep ) +# end diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb new file mode 100644 index 0000000..72aca7e --- /dev/null +++ b/config/initializers/mime_types.rb @@ -0,0 +1,5 @@ +# Be sure to restart your server when you modify this file. + +# Add new mime types for use in respond_to blocks: +# Mime::Type.register "text/richtext", :rtf +# Mime::Type.register_alias "text/html", :iphone diff --git a/config/initializers/secret_token.rb b/config/initializers/secret_token.rb new file mode 100644 index 0000000..28509ab --- /dev/null +++ b/config/initializers/secret_token.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# Your secret key for verifying the integrity of signed cookies. +# If you change this key, all old signed cookies will become invalid! +# Make sure the secret is at least 30 characters and all random, +# no regular words or you'll be exposed to dictionary attacks. +Abidownloads::Application.config.secret_token = '0c32dab080a056a39d8f387a5ebef9f286b0d4c02f9d07bd3b59b4ab9ee09447538116ea3f4c66d66d4ef20229379ef3962a76ee8a878caa85af09c25a5239a0' diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb new file mode 100644 index 0000000..db38684 --- /dev/null +++ b/config/initializers/session_store.rb @@ -0,0 +1,8 @@ +# Be sure to restart your server when you modify this file. + +Abidownloads::Application.config.session_store :cookie_store, key: '_abidownloads_session' + +# Use the database for sessions instead of the cookie-based default, +# which shouldn't be used to store highly confidential information +# (create the session table with "rails generate session_migration") +# Abidownloads::Application.config.session_store :active_record_store diff --git a/config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb new file mode 100644 index 0000000..999df20 --- /dev/null +++ b/config/initializers/wrap_parameters.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. +# +# This file contains settings for ActionController::ParamsWrapper which +# is enabled by default. + +# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. +ActiveSupport.on_load(:action_controller) do + wrap_parameters format: [:json] +end + +# Disable root element in JSON by default. +ActiveSupport.on_load(:active_record) do + self.include_root_in_json = false +end diff --git a/config/locales/devise.en.yml b/config/locales/devise.en.yml new file mode 100644 index 0000000..b182635 --- /dev/null +++ b/config/locales/devise.en.yml @@ -0,0 +1,58 @@ +# Additional translations at http://github.com/plataformatec/devise/wiki/I18n + +en: + errors: + messages: + expired: "has expired, please request a new one" + not_found: "not found" + already_confirmed: "was already confirmed, please try signing in" + not_locked: "was not locked" + not_saved: + one: "1 error prohibited this %{resource} from being saved:" + other: "%{count} errors prohibited this %{resource} from being saved:" + + devise: + failure: + already_authenticated: 'You are already signed in.' + unauthenticated: 'You need to sign in or sign up before continuing.' + unconfirmed: 'You have to confirm your account before continuing.' + locked: 'Your account is locked.' + invalid: 'Invalid email or password.' + invalid_token: 'Invalid authentication token.' + timeout: 'Your session expired, please sign in again to continue.' + inactive: 'Your account was not activated yet.' + sessions: + signed_in: 'Signed in successfully.' + signed_out: 'Signed out successfully.' + passwords: + send_instructions: 'You will receive an email with instructions about how to reset your password in a few minutes.' + updated: 'Your password was changed successfully. You are now signed in.' + updated_not_active: 'Your password was changed successfully.' + send_paranoid_instructions: "If your e-mail exists on our database, you will receive a password recovery link on your e-mail" + confirmations: + send_instructions: 'You will receive an email with instructions about how to confirm your account in a few minutes.' + send_paranoid_instructions: 'If your e-mail exists on our database, you will receive an email with instructions about how to confirm your account in a few minutes.' + confirmed: 'Your account was successfully confirmed. You are now signed in.' + registrations: + signed_up: 'Welcome! You have signed up successfully.' + inactive_signed_up: 'You have signed up successfully. However, we could not sign you in because your account is %{reason}.' + updated: 'You updated your account successfully.' + destroyed: 'Bye! Your account was successfully cancelled. We hope to see you again soon.' + reasons: + inactive: 'inactive' + unconfirmed: 'unconfirmed' + locked: 'locked' + unlocks: + send_instructions: 'You will receive an email with instructions about how to unlock your account in a few minutes.' + unlocked: 'Your account was successfully unlocked. You are now signed in.' + send_paranoid_instructions: 'If your account exists, you will receive an email with instructions about how to unlock it in a few minutes.' + omniauth_callbacks: + success: 'Successfully authorized from %{kind} account.' + failure: 'Could not authorize you from %{kind} because "%{reason}".' + mailer: + confirmation_instructions: + subject: 'Confirmation instructions' + reset_password_instructions: + subject: 'Reset password instructions' + unlock_instructions: + subject: 'Unlock Instructions' diff --git a/config/locales/en.yml b/config/locales/en.yml new file mode 100644 index 0000000..179c14c --- /dev/null +++ b/config/locales/en.yml @@ -0,0 +1,5 @@ +# Sample localization file for English. Add more files in this directory for other locales. +# See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. + +en: + hello: "Hello world" diff --git a/config/routes.rb b/config/routes.rb new file mode 100644 index 0000000..99cacc6 --- /dev/null +++ b/config/routes.rb @@ -0,0 +1,76 @@ +Abidownloads::Application.routes.draw do + as :admin_user do + match '/admin_users/confirmation' => 'admin/confirmations#update', :via => :put, :as => :update_user_confirmation + end + + devise_for :admin_users, :controllers => { + :sessions => "admin/sessions", + :passwords => "admin/passwords", + #:registrations => "admin/registrations", + :confirmations => "admin/confirmations", + :unlocks => "admin/unlocks" + } + + namespace :admin do + root :to => "dashboard#index", :as => :dashboard + resources :admin_users + end + + # The priority is based upon order of creation: + # first created -> highest priority. + + # Sample of regular route: + # match 'products/:id' => 'catalog#view' + # Keep in mind you can assign values other than :controller and :action + + # Sample of named route: + # match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase + # This route can be invoked with purchase_url(:id => product.id) + + # Sample resource route (maps HTTP verbs to controller actions automatically): + # resources :products + + # Sample resource route with options: + # resources :products do + # member do + # get 'short' + # post 'toggle' + # end + # + # collection do + # get 'sold' + # end + # end + + # Sample resource route with sub-resources: + # resources :products do + # resources :comments, :sales + # resource :seller + # end + + # Sample resource route with more complex sub-resources + # resources :products do + # resources :comments + # resources :sales do + # get 'recent', :on => :collection + # end + # end + + # Sample resource route within a namespace: + # namespace :admin do + # # Directs /admin/products/* to Admin::ProductsController + # # (app/controllers/admin/products_controller.rb) + # resources :products + # end + + # You can have the root of your site routed with "root" + # just remember to delete public/index.html. + # root :to => 'welcome#index' + root :to => 'home#index' + + # See how all your routes lay out with "rake routes" + + # This is a legacy wild controller route that's not recommended for RESTful applications. + # Note: This route will make all actions in every controller accessible via GET requests. + # match ':controller(/:action(/:id(.:format)))' +end diff --git a/db/migrate/20111007155450_devise_create_admin_users.rb b/db/migrate/20111007155450_devise_create_admin_users.rb new file mode 100644 index 0000000..516496d --- /dev/null +++ b/db/migrate/20111007155450_devise_create_admin_users.rb @@ -0,0 +1,28 @@ +class DeviseCreateAdminUsers < ActiveRecord::Migration + def self.up + create_table(:admin_users) do |t| + t.database_authenticatable :null => false + t.recoverable + t.rememberable + t.trackable + + # t.encryptable + t.confirmable + t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both + # t.token_authenticatable + + + t.timestamps + end + + add_index :admin_users, :email, :unique => true + add_index :admin_users, :reset_password_token, :unique => true + add_index :admin_users, :confirmation_token, :unique => true + add_index :admin_users, :unlock_token, :unique => true + # add_index :admin_users, :authentication_token, :unique => true + end + + def self.down + drop_table :admin_users + end +end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 0000000..87d5a77 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,61 @@ +# encoding: UTF-8 +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended to check this file into your version control system. + +ActiveRecord::Schema.define(:version => 20111007155450) do + + create_table "admin_users", :force => true do |t| + t.string "email", :default => "", :null => false + t.string "encrypted_password", :limit => 128, :default => "", :null => false + t.string "reset_password_token" + t.datetime "reset_password_sent_at" + t.datetime "remember_created_at" + t.integer "sign_in_count", :default => 0 + t.datetime "current_sign_in_at" + t.datetime "last_sign_in_at" + t.string "current_sign_in_ip" + t.string "last_sign_in_ip" + t.string "confirmation_token" + t.datetime "confirmed_at" + t.datetime "confirmation_sent_at" + t.integer "failed_attempts", :default => 0 + t.string "unlock_token" + t.datetime "locked_at" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "admin_users", ["confirmation_token"], :name => "index_admin_users_on_confirmation_token", :unique => true + add_index "admin_users", ["email"], :name => "index_admin_users_on_email", :unique => true + add_index "admin_users", ["reset_password_token"], :name => "index_admin_users_on_reset_password_token", :unique => true + add_index "admin_users", ["unlock_token"], :name => "index_admin_users_on_unlock_token", :unique => true + + create_table "downloads", :force => true do |t| + t.string "name" + t.text "description" + t.integer "size" + t.string "mime_type" + t.datetime "created_at" + t.datetime "updated_at" + end + + create_table "folders", :force => true do |t| + t.string "name" + t.text "description" + t.integer "parent_id" + t.integer "lft" + t.integer "rgt" + t.datetime "created_at" + t.datetime "updated_at" + end + +end diff --git a/db/seeds.rb b/db/seeds.rb new file mode 100644 index 0000000..4edb1e8 --- /dev/null +++ b/db/seeds.rb @@ -0,0 +1,7 @@ +# This file should contain all the record creation needed to seed the database with its default values. +# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup). +# +# Examples: +# +# cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }]) +# Mayor.create(name: 'Emanuel', city: cities.first) diff --git a/doc/README_FOR_APP b/doc/README_FOR_APP new file mode 100644 index 0000000..fe41f5c --- /dev/null +++ b/doc/README_FOR_APP @@ -0,0 +1,2 @@ +Use this README file to introduce your application and point to useful places in the API for learning more. +Run "rake doc:app" to generate API documentation for your models, controllers, helpers, and libraries. diff --git a/lib/assets/.gitkeep b/lib/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/lib/tasks/.gitkeep b/lib/tasks/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/log/.gitkeep b/log/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..fec2fca88643d4ecb2def9e4d75324d133ee895e GIT binary patch literal 4070 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 + + + The page you were looking for doesn't exist (404) + + + + + +
+

The page you were looking for doesn't exist.

+

You may have mistyped the address or the page may have moved.

+
+ + diff --git a/public/422.html b/public/422.html new file mode 100644 index 0000000..83660ab --- /dev/null +++ b/public/422.html @@ -0,0 +1,26 @@ + + + + The change you wanted was rejected (422) + + + + + +
+

The change you wanted was rejected.

+

Maybe you tried to change something you didn't have access to.

+
+ + diff --git a/public/500.html b/public/500.html new file mode 100644 index 0000000..b80307f --- /dev/null +++ b/public/500.html @@ -0,0 +1,26 @@ + + + + We're sorry, but something went wrong (500) + + + + + +
+

We're sorry, but something went wrong.

+

We've been notified about this issue and we'll take a look at it shortly.

+
+ + diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..e69de29 diff --git a/public/index.html_ b/public/index.html_ new file mode 100644 index 0000000..9d9811a --- /dev/null +++ b/public/index.html_ @@ -0,0 +1,241 @@ + + + + Ruby on Rails: Welcome aboard + + + + +
+ + +
+ + + + +
+

Getting started

+

Here’s how to get rolling:

+ +
    +
  1. +

    Use rails generate to create your models and controllers

    +

    To see all available options, run it without parameters.

    +
  2. + +
  3. +

    Set up a default route and remove public/index.html

    +

    Routes are set up in config/routes.rb.

    +
  4. + +
  5. +

    Create your database

    +

    Run rake db:create to create your database. If you're not using SQLite (the default), edit config/database.yml with your username and password.

    +
  6. +
+
+
+ + +
+ + diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..085187f --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,5 @@ +# See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file +# +# To ban all spiders from the entire site uncomment the next two lines: +# User-Agent: * +# Disallow: / diff --git a/script/rails b/script/rails new file mode 100755 index 0000000..f8da2cf --- /dev/null +++ b/script/rails @@ -0,0 +1,6 @@ +#!/usr/bin/env ruby +# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application. + +APP_PATH = File.expand_path('../../config/application', __FILE__) +require File.expand_path('../../config/boot', __FILE__) +require 'rails/commands' diff --git a/test/fixtures/.gitkeep b/test/fixtures/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/test/fixtures/admin_users.yml b/test/fixtures/admin_users.yml new file mode 100644 index 0000000..5394fa3 --- /dev/null +++ b/test/fixtures/admin_users.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/Fixtures.html + +# This model initially had no columns defined. If you add columns to the +# model remove the '{}' from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/functional/.gitkeep b/test/functional/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/test/functional/admin/admin_controller_test.rb b/test/functional/admin/admin_controller_test.rb new file mode 100644 index 0000000..d32ccbb --- /dev/null +++ b/test/functional/admin/admin_controller_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class Admin::AdminControllerTest < ActionController::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/functional/admin/dashboard_controller_test.rb b/test/functional/admin/dashboard_controller_test.rb new file mode 100644 index 0000000..2b0b8a1 --- /dev/null +++ b/test/functional/admin/dashboard_controller_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class Admin::DashboardControllerTest < ActionController::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/functional/admin/downloads_controller_test.rb b/test/functional/admin/downloads_controller_test.rb new file mode 100644 index 0000000..2cc27e1 --- /dev/null +++ b/test/functional/admin/downloads_controller_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class Admin::DownloadsControllerTest < ActionController::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/functional/admin/unlocks_controller_test.rb b/test/functional/admin/unlocks_controller_test.rb new file mode 100644 index 0000000..2cd3d95 --- /dev/null +++ b/test/functional/admin/unlocks_controller_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class Admin::UnlocksControllerTest < ActionController::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/functional/home_controller_test.rb b/test/functional/home_controller_test.rb new file mode 100644 index 0000000..730478d --- /dev/null +++ b/test/functional/home_controller_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class HomeControllerTest < ActionController::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/integration/.gitkeep b/test/integration/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/test/performance/browsing_test.rb b/test/performance/browsing_test.rb new file mode 100644 index 0000000..3fea27b --- /dev/null +++ b/test/performance/browsing_test.rb @@ -0,0 +1,12 @@ +require 'test_helper' +require 'rails/performance_test_help' + +class BrowsingTest < ActionDispatch::PerformanceTest + # Refer to the documentation for all available options + # self.profile_options = { :runs => 5, :metrics => [:wall_time, :memory] + # :output => 'tmp/performance', :formats => [:flat] } + + def test_homepage + get '/' + end +end diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 0000000..8bf1192 --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,13 @@ +ENV["RAILS_ENV"] = "test" +require File.expand_path('../../config/environment', __FILE__) +require 'rails/test_help' + +class ActiveSupport::TestCase + # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order. + # + # Note: You'll currently still have to declare fixtures explicitly in integration tests + # -- they do not yet inherit this setting + fixtures :all + + # Add more helper methods to be used by all tests here... +end diff --git a/test/unit/.gitkeep b/test/unit/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/test/unit/admin_user_test.rb b/test/unit/admin_user_test.rb new file mode 100644 index 0000000..6215c04 --- /dev/null +++ b/test/unit/admin_user_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class AdminUserTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/unit/helpers/admin/admin_helper_test.rb b/test/unit/helpers/admin/admin_helper_test.rb new file mode 100644 index 0000000..28ed129 --- /dev/null +++ b/test/unit/helpers/admin/admin_helper_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class Admin::AdminHelperTest < ActionView::TestCase +end diff --git a/test/unit/helpers/admin/dashboard_helper_test.rb b/test/unit/helpers/admin/dashboard_helper_test.rb new file mode 100644 index 0000000..70e2bb0 --- /dev/null +++ b/test/unit/helpers/admin/dashboard_helper_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class Admin::DashboardHelperTest < ActionView::TestCase +end diff --git a/test/unit/helpers/admin/downloads_helper_test.rb b/test/unit/helpers/admin/downloads_helper_test.rb new file mode 100644 index 0000000..2ad3995 --- /dev/null +++ b/test/unit/helpers/admin/downloads_helper_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class Admin::DownloadsHelperTest < ActionView::TestCase +end diff --git a/test/unit/helpers/admin/unlocks_helper_test.rb b/test/unit/helpers/admin/unlocks_helper_test.rb new file mode 100644 index 0000000..d4d5215 --- /dev/null +++ b/test/unit/helpers/admin/unlocks_helper_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class Admin::UnlocksHelperTest < ActionView::TestCase +end diff --git a/test/unit/helpers/home_helper_test.rb b/test/unit/helpers/home_helper_test.rb new file mode 100644 index 0000000..4740a18 --- /dev/null +++ b/test/unit/helpers/home_helper_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class HomeHelperTest < ActionView::TestCase +end diff --git a/vendor/assets/stylesheets/.gitkeep b/vendor/assets/stylesheets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/vendor/plugins/.gitkeep b/vendor/plugins/.gitkeep new file mode 100644 index 0000000..e69de29