diff --git a/.gitignore.rails2 b/.gitignore.rails2
new file mode 100644
index 00000000..8e2cc0f5
--- /dev/null
+++ b/.gitignore.rails2
@@ -0,0 +1,25 @@
+*~
+*.tmproj
+.dotest
+/.emacs-project
+/.redcar
+config/database.yml
+config/site.yml
+config/deploy.rb
+db/*.sqlite3
+db/data.yml
+db/schema.rb
+log
+nbproject
+public/javascripts/cache
+public/stylesheets/cache
+tmp
+vendor/plugins/query_trace/
+rerun.txt
+public/javascripts/jquery-cached.js
+public/javascripts/tracks-cached.js
+public/stylesheets/tracks-cached.css
+.idea
+.rvmrc
+.yardoc
+tags
diff --git a/Gemfile b/Gemfile
index 87eca690..ab4e34b2 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,64 +1,38 @@
-source :gemcutter
-source "http://gems.github.com/"
+source 'https://rubygems.org'
-gem "rake", "~>0.8.7"
-gem "rails", "~>2.3.12"
-gem "highline", "~>1.5.0"
-gem "RedCloth", "4.2.8"
-gem "sanitize", "~>1.2.1"
-gem "rack", "1.1.0"
-gem "will_paginate", "~> 2.3.15"
-gem "acts_as_list", "~>0.1.4"
-gem "aasm", "~>2.2.0"
-gem "rubyjedi-actionwebservice", :require => "actionwebservice"
-gem "rubycas-client", "~>2.2.1"
-gem "ruby-openid", :require => "openid"
+gem 'rails', '3.2.3'
-# you may comment out the database driver you will not be using.
-# This will prevent a native build of the driver. Building native drivers is not always possible on all hosters
-gem "sqlite3"
-gem "mysql"
+# Bundle edge Rails instead:
+# gem 'rails', :git => 'git://github.com/rails/rails.git'
-gem 'bcrypt-ruby', '~> 2.1.4'
-gem 'htmlentities', '~> 4.3.0'
-gem "mail"
+gem 'sqlite3'
-if RUBY_VERSION.to_f >= 1.9
- gem "soap4r-ruby1.9"
-else
- gem "soap4r", "~>1.5.8"
+
+# Gems used only for assets and not required
+# in production environments by default.
+group :assets do
+ gem 'sass-rails', '~> 3.2.3'
+ gem 'coffee-rails', '~> 3.2.1'
+
+ # See https://github.com/sstephenson/execjs#readme for more supported runtimes
+ # gem 'therubyracer', :platform => :ruby
+
+ gem 'uglifier', '>= 1.0.3'
end
-group :development do
- if RUBY_VERSION.to_f >= 1.9
- gem "ruby-debug19"
- gem "mongrel", "1.2.0.pre2"
- else
- gem "ruby-debug"
- gem "mongrel"
- end
- gem "yard"
-end
+gem 'jquery-rails'
-group :test do
- gem "test-unit", "1.2.3"
- gem "flexmock"
- gem "ZenTest", ">=4.0.0"
- gem "hpricot"
- gem "hoe"
- gem "rspec-rails", "~>1.3.3"
- gem "thoughtbot-factory_girl"
- gem 'memory_test_fix', '~>0.1.3'
- gem "capybara", ">=0.3.5"
- gem "selenium-webdriver" # Note that > 2.14 has problems: https://code.google.com/p/selenium/issues/detail?id=3075
- gem "database_cleaner", ">=0.5.0"
- gem "cucumber-rails", "~>0.3.2"
- gem "aruba", "0.2.2", :path => "vendor/gems/aruba-0.2.2"
-
- # uncomment to use the webkit option. This depends on Qt to be installed
- #gem "capybara-webkit"
-
- # uncomment to be able to make screenshots from scenarios
- #gem "capybara-screenshot"
- #gem "launchy"
-end
+# To use ActiveModel has_secure_password
+# gem 'bcrypt-ruby', '~> 3.0.0'
+
+# To use Jbuilder templates for JSON
+# gem 'jbuilder'
+
+# Use unicorn as the app server
+# gem 'unicorn'
+
+# Deploy with Capistrano
+# gem 'capistrano'
+
+# To use debugger
+# gem 'ruby-debug19', :require => 'ruby-debug'
diff --git a/Gemfile.lock b/Gemfile.lock
index 783cfdf0..6d053889 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,28 +1,36 @@
-PATH
- remote: vendor/gems/aruba-0.2.2
- specs:
- aruba (0.2.2)
-
GEM
- remote: http://rubygems.org/
- remote: http://gems.github.com/
+ remote: https://rubygems.org/
specs:
- RedCloth (4.2.8)
- ZenTest (4.6.2)
- aasm (2.2.1)
- actionmailer (2.3.14)
- actionpack (= 2.3.14)
- actionpack (2.3.14)
- activesupport (= 2.3.14)
- rack (~> 1.1.0)
- activerecord (2.3.14)
- activesupport (= 2.3.14)
- activeresource (2.3.14)
- activesupport (= 2.3.14)
- activesupport (2.3.14)
- acts_as_list (0.1.4)
- bcrypt-ruby (2.1.4)
+ actionmailer (3.2.3)
+ actionpack (= 3.2.3)
+ mail (~> 2.4.4)
+ actionpack (3.2.3)
+ activemodel (= 3.2.3)
+ activesupport (= 3.2.3)
+ builder (~> 3.0.0)
+ erubis (~> 2.7.0)
+ journey (~> 1.0.1)
+ rack (~> 1.4.0)
+ rack-cache (~> 1.2)
+ rack-test (~> 0.6.1)
+ sprockets (~> 2.1.2)
+ activemodel (3.2.3)
+ activesupport (= 3.2.3)
+ builder (~> 3.0.0)
+ activerecord (3.2.3)
+ activemodel (= 3.2.3)
+ activesupport (= 3.2.3)
+ arel (~> 3.0.2)
+ tzinfo (~> 0.3.29)
+ activeresource (3.2.3)
+ activemodel (= 3.2.3)
+ activesupport (= 3.2.3)
+ activesupport (3.2.3)
+ i18n (~> 0.6)
+ multi_json (~> 1.0)
+ arel (3.0.2)
builder (3.0.0)
+<<<<<<< HEAD
capybara (1.1.2)
mime-types (>= 1.16)
nokogiri (>= 1.3.3)
@@ -57,80 +65,82 @@ GEM
hpricot (0.8.6)
htmlentities (4.3.1)
httpclient (2.2.4)
+=======
+ coffee-rails (3.2.2)
+ coffee-script (>= 2.2.0)
+ railties (~> 3.2.0)
+ coffee-script (2.2.0)
+ coffee-script-source
+ execjs
+ coffee-script-source (1.2.0)
+ erubis (2.7.0)
+ execjs (1.3.0)
+ multi_json (~> 1.0)
+ hike (1.2.1)
+>>>>>>> initial upgrade to rails 3.2.3
i18n (0.6.0)
- json (1.6.5)
- linecache (0.46)
- rbx-require-relative (> 0.0.4)
- mail (2.4.1)
+ journey (1.0.3)
+ jquery-rails (2.0.2)
+ railties (>= 3.2.0, < 5.0)
+ thor (~> 0.14)
+ json (1.6.6)
+ mail (2.4.4)
i18n (>= 0.4.0)
mime-types (~> 1.16)
treetop (~> 1.4.8)
- memory_test_fix (0.1.3)
- mime-types (1.17.2)
- mongrel (1.1.5)
- cgi_multipart_eof_fix (>= 2.4)
- daemons (>= 1.0.3)
- fastthread (>= 1.0.1)
- gem_plugin (>= 0.2.3)
- multi_json (1.1.0)
- mysql (2.8.1)
- nokogiri (1.4.7)
+ mime-types (1.18)
+ multi_json (1.2.0)
polyglot (0.3.3)
- rack (1.1.0)
+ rack (1.4.1)
+ rack-cache (1.2)
+ rack (>= 0.4)
+ rack-ssl (1.3.2)
+ rack
rack-test (0.6.1)
rack (>= 1.0)
- rails (2.3.14)
- actionmailer (= 2.3.14)
- actionpack (= 2.3.14)
- activerecord (= 2.3.14)
- activeresource (= 2.3.14)
- activesupport (= 2.3.14)
- rake (>= 0.8.3)
- rake (0.8.7)
- rbx-require-relative (0.0.5)
- rspec (1.3.2)
- rspec-rails (1.3.4)
- rack (>= 1.0.0)
- rspec (~> 1.3.1)
- ruby-debug (0.10.4)
- columnize (>= 0.1)
- ruby-debug-base (~> 0.10.4.0)
- ruby-debug-base (0.10.4)
- linecache (>= 0.3)
- ruby-openid (2.1.8)
- rubycas-client (2.2.1)
- activesupport
- rubyjedi-actionwebservice (2.3.5.20100714122544)
- actionpack (~> 2.3.0)
- activerecord (~> 2.3.0)
- activesupport (~> 2.3.0)
- rubyzip (0.9.6.1)
- sanitize (1.2.1)
- nokogiri (~> 1.4.1)
- selenium-webdriver (2.20.0)
- childprocess (>= 0.2.5)
- ffi (~> 1.0)
- multi_json (~> 1.0)
- rubyzip
- soap4r (1.5.8)
- httpclient (>= 2.1.1)
+ rails (3.2.3)
+ actionmailer (= 3.2.3)
+ actionpack (= 3.2.3)
+ activerecord (= 3.2.3)
+ activeresource (= 3.2.3)
+ activesupport (= 3.2.3)
+ bundler (~> 1.0)
+ railties (= 3.2.3)
+ railties (3.2.3)
+ actionpack (= 3.2.3)
+ activesupport (= 3.2.3)
+ rack-ssl (~> 1.3.2)
+ rake (>= 0.8.7)
+ rdoc (~> 3.4)
+ thor (~> 0.14.6)
+ rake (0.9.2.2)
+ rdoc (3.12)
+ json (~> 1.4)
+ sass (3.1.15)
+ sass-rails (3.2.5)
+ railties (~> 3.2.0)
+ sass (>= 3.1.10)
+ tilt (~> 1.3)
+ sprockets (2.1.2)
+ hike (~> 1.2)
+ rack (~> 1.0)
+ tilt (~> 1.1, != 1.3.0)
sqlite3 (1.3.5)
- term-ansicolor (1.0.7)
- test-unit (1.2.3)
- hoe (>= 1.5.1)
- thoughtbot-factory_girl (1.2.2)
+ thor (0.14.6)
+ tilt (1.3.3)
treetop (1.4.10)
polyglot
polyglot (>= 0.3.1)
- will_paginate (2.3.16)
- xpath (0.1.4)
- nokogiri (~> 1.3)
- yard (0.7.5)
+ tzinfo (0.3.32)
+ uglifier (1.2.4)
+ execjs (>= 0.3.0)
+ multi_json (>= 1.0.2)
PLATFORMS
ruby
DEPENDENCIES
+<<<<<<< HEAD
RedCloth (= 4.2.8)
ZenTest (>= 4.0.0)
aasm (~> 2.2.0)
@@ -160,8 +170,11 @@ DEPENDENCIES
sanitize (~> 1.2.1)
selenium-webdriver
soap4r (~> 1.5.8)
+=======
+ coffee-rails (~> 3.2.1)
+ jquery-rails
+ rails (= 3.2.3)
+ sass-rails (~> 3.2.3)
+>>>>>>> initial upgrade to rails 3.2.3
sqlite3
- test-unit (= 1.2.3)
- thoughtbot-factory_girl
- will_paginate (~> 2.3.15)
- yard
+ uglifier (>= 1.0.3)
diff --git a/Gemfile.rails2.3 b/Gemfile.rails2.3
new file mode 100644
index 00000000..dc3af876
--- /dev/null
+++ b/Gemfile.rails2.3
@@ -0,0 +1,65 @@
+source :gemcutter
+source "http://gems.github.com/"
+
+gem "rake", "~>0.8.7"
+gem "rails", "~>2.3.12"
+gem "highline", "~>1.5.0"
+gem "RedCloth", "4.2.8"
+gem "sanitize", "~>1.2.1"
+gem "rack", "1.1.0"
+gem "will_paginate", "~> 2.3.15"
+gem "has_many_polymorphs", "~> 2.13"
+gem "acts_as_list", "~>0.1.4"
+gem "aasm", "~>2.2.0"
+gem "rubyjedi-actionwebservice", :require => "actionwebservice"
+gem "rubycas-client", "~>2.2.1"
+gem "ruby-openid", :require => "openid"
+
+# you may comment out the database driver you will not be using.
+# This will prevent a native build of the driver. Building native drivers is not always possible on all hosters
+gem "sqlite3"
+gem "mysql"
+
+gem 'bcrypt-ruby', '~> 2.1.4'
+gem 'htmlentities', '~> 4.3.0'
+gem "mail"
+
+if RUBY_VERSION.to_f >= 1.9
+ gem "soap4r-ruby1.9"
+else
+ gem "soap4r", "~>1.5.8"
+end
+
+group :development do
+ if RUBY_VERSION.to_f >= 1.9
+ gem "ruby-debug19"
+ gem "mongrel", "1.2.0.pre2"
+ else
+ gem "ruby-debug"
+ gem "mongrel"
+ end
+ gem "yard"
+end
+
+group :test do
+ gem "test-unit", "1.2.3"
+ gem "flexmock"
+ gem "ZenTest", ">=4.0.0"
+ gem "hpricot"
+ gem "hoe"
+ gem "rspec-rails", "~>1.3.3"
+ gem "thoughtbot-factory_girl"
+ gem 'memory_test_fix', '~>0.1.3'
+ gem "capybara", ">=0.3.5"
+ gem "selenium-webdriver" # Note that > 2.14 has problems: https://code.google.com/p/selenium/issues/detail?id=3075
+ gem "database_cleaner", ">=0.5.0"
+ gem "cucumber-rails", "~>0.3.2"
+ gem "aruba", "0.2.2", :path => "vendor/gems/aruba-0.2.2"
+
+ # uncomment to use the webkit option. This depends on Qt to be installed
+ #gem "capybara-webkit"
+
+ # uncomment to be able to make screenshots from scenarios
+ #gem "capybara-screenshot"
+ #gem "launchy"
+end
diff --git a/Gemfile.rails3 b/Gemfile.rails3
new file mode 100644
index 00000000..c07b2b6a
--- /dev/null
+++ b/Gemfile.rails3
@@ -0,0 +1,39 @@
+source 'https://rubygems.org'
+
+gem 'rails', '3.2.3'
+
+# Bundle edge Rails instead:
+# gem 'rails', :git => 'git://github.com/rails/rails.git'
+
+gem 'sqlite3'
+gem 'mysql'
+
+
+# Gems used only for assets and not required
+# in production environments by default.
+group :assets do
+ gem 'sass-rails', '~> 3.2.3'
+ gem 'coffee-rails', '~> 3.2.1'
+
+ # See https://github.com/sstephenson/execjs#readme for more supported runtimes
+ # gem 'therubyracer', :platform => :ruby
+
+ gem 'uglifier', '>= 1.0.3'
+end
+
+gem 'jquery-rails'
+
+# To use ActiveModel has_secure_password
+# gem 'bcrypt-ruby', '~> 3.0.0'
+
+# To use Jbuilder templates for JSON
+# gem 'jbuilder'
+
+# Use unicorn as the app server
+# gem 'unicorn'
+
+# Deploy with Capistrano
+# gem 'capistrano'
+
+# To use debugger
+# gem 'ruby-debug19', :require => 'ruby-debug'
diff --git a/README.rdoc b/README.rdoc
new file mode 100644
index 00000000..7c36f235
--- /dev/null
+++ b/README.rdoc
@@ -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
index 2704572a..af3b6bdc 100644
--- a/Rakefile
+++ b/Rakefile
@@ -1,16 +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.join(File.dirname(__FILE__), 'config', 'boot'))
+require File.expand_path('../config/application', __FILE__)
-require 'rake'
-require 'rake/testtask'
-require 'rake/rdoctask'
-
-require 'tasks/rails'
-
-begin
- require 'test/rails/rake_tasks'
-rescue LoadError => e
- #It's ok if you don't have ZenTest installed if you're not a developer
-end
+Tracksapp::Application.load_tasks
diff --git a/app/assets/images/rails.png b/app/assets/images/rails.png
new file mode 100644
index 00000000..d5edc04e
Binary files /dev/null and b/app/assets/images/rails.png differ
diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js
new file mode 100644
index 00000000..9097d830
--- /dev/null
+++ b/app/assets/javascripts/application.js
@@ -0,0 +1,15 @@
+// This is a manifest file that'll be compiled into application.js, which will include all the files
+// listed below.
+//
+// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
+// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
+//
+// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
+// the compiled file.
+//
+// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
+// GO AFTER THE REQUIRES BELOW.
+//
+//= require jquery
+//= require jquery_ujs
+//= require_tree .
diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css
new file mode 100644
index 00000000..3b5cc664
--- /dev/null
+++ b/app/assets/stylesheets/application.css
@@ -0,0 +1,13 @@
+/*
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
+ * listed below.
+ *
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
+ * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
+ *
+ * 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_tree .
+*/
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 761be1d9..e8065d95 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -1,324 +1,3 @@
-# The filters added to this controller will be run for all controllers in the
-# application. Likewise will all the methods added be available for all
-# controllers.
-
-require_dependency "login_system"
-require_dependency "tracks/source_view"
-
class ApplicationController < ActionController::Base
-
protect_from_forgery
-
- helper :application
- include LoginSystem
- helper_method :current_user, :prefs, :format_date
-
- layout proc{ |controller| controller.mobile? ? "mobile" : "standard" }
- exempt_from_layout /\.js\.erb$/
-
- before_filter :check_for_deprecated_password_hash
- before_filter :set_session_expiration
- before_filter :set_time_zone
- before_filter :set_zindex_counter
- before_filter :set_locale
- prepend_before_filter :login_required
- prepend_before_filter :enable_mobile_content_negotiation
- after_filter :set_charset
-
- # By default, sets the charset to UTF-8 if it isn't already set
- def set_charset
- headers["Content-Type"] ||= "text/html; charset=UTF-8"
- end
-
- def set_locale
- locale = params[:locale] # specifying a locale in the request takes precedence
- locale = locale || prefs.locale unless current_user.nil? # otherwise, the locale of the currently logged in user takes over
- locale = locale || request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first if request.env['HTTP_ACCEPT_LANGUAGE']
- I18n.locale = locale.nil? ? I18n.default_locale : (I18n::available_locales.include?(locale.to_sym) ? locale : I18n.default_locale)
- logger.debug("Selected '#{I18n.locale}' as locale")
- end
-
- def set_session_expiration
- # http://wiki.rubyonrails.com/rails/show/HowtoChangeSessionOptions
- unless session == nil
- return if self.controller_name == 'feed' or session['noexpiry'] == "on"
- # If the method is called by the feed controller (which we don't have
- # under session control) or if we checked the box to keep logged in on
- # login don't set the session expiry time.
- if session
- # Get expiry time (allow ten seconds window for the case where we have
- # none)
- expiry_time = session['expiry_time'] || Time.now + 10
- if expiry_time < Time.now
- # Too late, matey... bang goes your session!
- reset_session
- else
- # Okay, you get another hour
- session['expiry_time'] = Time.now + (60*60)
- end
- end
- end
- end
-
- # Redirects to change_password_user_path if the current user uses a
- # deprecated password hashing algorithm.
- def check_for_deprecated_password_hash
- if current_user and current_user.uses_deprecated_password?
- notify :warning, t('users.you_have_to_reset_your_password')
- redirect_to change_password_user_path current_user
- end
- end
-
- def render_failure message, status = 404
- render :text => message, :status => status
- end
-
- # def rescue_action(exception)
- # log_error(exception) if logger
- # respond_to do |format|
- # format.html do
- # notify :warning, "An error occurred on the server."
- # render :action => "index"
- # end
- # format.js { render :action => 'error' }
- # format.xml { render :text => 'An error occurred on the server.' + $! }
- # end
- # end
-
- # Returns a count of next actions in the given context or project The result
- # is count and a string descriptor, correctly pluralised if there are no
- # actions or multiple actions
- #
- def count_undone_todos_phrase(todos_parent)
- count = count_undone_todos(todos_parent)
- deferred_count = count_deferred_todos(todos_parent)
- if count == 0 && deferred_count > 0
- word = I18n.t('common.actions_midsentence', :count => deferred_count)
- word = I18n.t('common.deferred') + " " + word
- return deferred_count.to_s + " " + word
- else
- word = I18n.t('common.actions_midsentence', :count => count)
- return count.to_s + " " + word
- end
- end
-
- def count_undone_todos(todos_parent)
- if todos_parent.nil?
- count = 0
- elsif (todos_parent.is_a?(Project) && todos_parent.hidden?)
- count = eval "@project_project_hidden_todo_counts[#{todos_parent.id}]"
- else
- count = eval "@#{todos_parent.class.to_s.downcase}_not_done_counts[#{todos_parent.id}]"
- end
- count || 0
- end
-
- def count_deferred_todos(todos_parent)
- if todos_parent.nil?
- count = 0
- else
- count = todos_parent.todos.deferred.count
- end
- end
-
- # Convert a date object to the format specified in the user's preferences in
- # config/settings.yml
- #
- def format_date(date)
- return date ? date.in_time_zone(prefs.time_zone).strftime("#{prefs.date_format}") : ''
- end
-
- def for_autocomplete(coll, substr)
- if substr # protect agains empty request
- filtered = coll.find_all{|item| item.name.downcase.include? substr.downcase}
- json_elems = Array[*filtered.map{ |e| {:id => e.id.to_s, :value => e.name} }].to_json
- return json_elems
- else
- return ""
- end
- end
-
- def format_dependencies_as_json_for_auto_complete(entries)
- json_elems = Array[*entries.map{ |e| {:value => e.id.to_s, :label => e.specification} }].to_json
- return json_elems
- end
-
- # Here's the concept behind this "mobile content negotiation" hack: In
- # addition to the main, AJAXy Web UI, Tracks has a lightweight low-feature
- # 'mobile' version designed to be suitablef or use from a phone or PDA. It
- # makes some sense that tne pages of that mobile version are simply alternate
- # representations of the same Todo resources. The implementation goal was to
- # treat mobile as another format and be able to use respond_to to render both
- # versions. Unfortunately, I ran into a lot of trouble simply registering a
- # new mime type 'text/html' with format :m because :html already is linked to
- # that mime type and the new registration was forcing all html requests to be
- # rendered in the mobile view. The before_filter and after_filter hackery
- # below accomplishs that implementation goal by using a 'fake' mime type
- # during the processing and then setting it to 'text/html' in an
- # 'after_filter' -LKM 2007-04-01
- def mobile?
- return params[:format] == 'm'
- end
-
- def enable_mobile_content_negotiation
- if mobile?
- request.format = :m
- end
- end
-
- def create_todo_from_recurring_todo(rt, date=nil)
- # create todo and initialize with data from recurring_todo rt
- todo = current_user.todos.build( { :description => rt.description, :notes => rt.notes, :project_id => rt.project_id, :context_id => rt.context_id})
- todo.recurring_todo_id = rt.id
-
- # set dates
- todo.due = rt.get_due_date(date)
-
- show_from_date = rt.get_show_from_date(date)
- if show_from_date.nil?
- todo.show_from=nil
- else
- # make sure that show_from is not in the past
- todo.show_from = show_from_date < Time.zone.now ? nil : show_from_date
- end
-
- saved = todo.save
- if saved
- todo.tag_with(rt.tag_list)
- todo.tags.reload
- end
-
- # increate number of occurences created from recurring todo
- rt.inc_occurences
-
- # mark recurring todo complete if there are no next actions left
- checkdate = todo.due.nil? ? todo.show_from : todo.due
- rt.toggle_completion! unless rt.has_next_todo(checkdate)
-
- return saved ? todo : nil
- end
-
- def handle_unverified_request
- unless request.format=="application/xml"
- super # handle xml http auth via our own login code
- end
- end
-
- protected
-
- def admin_login_required
- unless User.find_by_id_and_is_admin(session['user_id'], true)
- render :text => t('errors.user_unauthorized'), :status => 401
- return false
- end
- end
-
- def redirect_back_or_home
- respond_to do |format|
- format.html { redirect_back_or_default home_url }
- format.m { redirect_back_or_default mobile_url }
- end
- end
-
- def boolean_param(param_name)
- return false if param_name.blank?
- s = params[param_name]
- return false if s.blank? || s == false || s =~ /^false$/i
- return true if s == true || s =~ /^true$/i
- raise ArgumentError.new("invalid value for Boolean: \"#{s}\"")
- end
-
- def self.openid_enabled?
- Tracks::Config.openid_enabled?
- end
-
- def openid_enabled?
- self.class.openid_enabled?
- end
-
- def self.cas_enabled?
- Tracks::Config.cas_enabled?
- end
-
- def cas_enabled?
- self.class.cas_enabled?
- end
-
- def self.prefered_auth?
- Tracks::Config.prefered_auth?
- end
-
- def prefered_auth?
- self.class.prefered_auth?
- end
-
- # all completed todos [today@00:00, today@now]
- def get_done_today(completed_todos, includes = {:include => Todo::DEFAULT_INCLUDES})
- start_of_this_day = Time.zone.now.beginning_of_day
- completed_todos.completed_after(start_of_this_day).all(includes)
- end
-
- # all completed todos [begin_of_week, start_of_today]
- def get_done_this_week(completed_todos, includes = {:include => Todo::DEFAULT_INCLUDES})
- start_of_this_week = Time.zone.now.beginning_of_week
- start_of_this_day = Time.zone.now.beginning_of_day
- completed_todos.completed_before(start_of_this_day).completed_after(start_of_this_week).all(includes)
- end
-
- # all completed todos [begin_of_month, begin_of_week]
- def get_done_this_month(completed_todos, includes = {:include => Todo::DEFAULT_INCLUDES})
- start_of_this_month = Time.zone.now.beginning_of_month
- start_of_this_week = Time.zone.now.beginning_of_week
- completed_todos.completed_before(start_of_this_week).completed_after(start_of_this_month).all(includes)
- end
-
- private
-
- def parse_date_per_user_prefs( s )
- prefs.parse_date(s)
- end
-
- def init_data_for_sidebar
- @completed_projects = current_user.projects.completed
- @hidden_projects = current_user.projects.hidden
- @active_projects = current_user.projects.active
-
- @active_contexts = current_user.contexts.active
- @hidden_contexts = current_user.contexts.hidden
-
- init_not_done_counts
- if prefs.show_hidden_projects_in_sidebar
- init_project_hidden_todo_counts(['project'])
- end
- end
-
- def init_not_done_counts(parents = ['project','context'])
- parents.each do |parent|
- eval("@#{parent}_not_done_counts = @#{parent}_not_done_counts || current_user.todos.active.count(:group => :#{parent}_id)")
- end
- end
-
- def init_project_hidden_todo_counts(parents = ['project','context'])
- parents.each do |parent|
- eval("@#{parent}_project_hidden_todo_counts = @#{parent}_project_hidden_todo_counts || current_user.todos.count(:conditions => ['state = ? or state = ?', 'project_hidden', 'active'], :group => :#{parent}_id)")
- end
- end
-
- # Set the contents of the flash message from a controller Usage: notify
- # :warning, "This is the message" Sets the flash of type 'warning' to "This is
- # the message"
- def notify(type, message)
- flash[type] = message
- logger.error("ERROR: #{message}") if type == :error
- end
-
- def set_time_zone
- Time.zone = current_user.prefs.time_zone if logged_in?
- end
-
- def set_zindex_counter
- # this counter can be used to handle the IE z-index bug
- @z_index_counter = 500
- end
-
end
diff --git a/app/controllers/application_controller.rb.rails2 b/app/controllers/application_controller.rb.rails2
new file mode 100644
index 00000000..761be1d9
--- /dev/null
+++ b/app/controllers/application_controller.rb.rails2
@@ -0,0 +1,324 @@
+# The filters added to this controller will be run for all controllers in the
+# application. Likewise will all the methods added be available for all
+# controllers.
+
+require_dependency "login_system"
+require_dependency "tracks/source_view"
+
+class ApplicationController < ActionController::Base
+
+ protect_from_forgery
+
+ helper :application
+ include LoginSystem
+ helper_method :current_user, :prefs, :format_date
+
+ layout proc{ |controller| controller.mobile? ? "mobile" : "standard" }
+ exempt_from_layout /\.js\.erb$/
+
+ before_filter :check_for_deprecated_password_hash
+ before_filter :set_session_expiration
+ before_filter :set_time_zone
+ before_filter :set_zindex_counter
+ before_filter :set_locale
+ prepend_before_filter :login_required
+ prepend_before_filter :enable_mobile_content_negotiation
+ after_filter :set_charset
+
+ # By default, sets the charset to UTF-8 if it isn't already set
+ def set_charset
+ headers["Content-Type"] ||= "text/html; charset=UTF-8"
+ end
+
+ def set_locale
+ locale = params[:locale] # specifying a locale in the request takes precedence
+ locale = locale || prefs.locale unless current_user.nil? # otherwise, the locale of the currently logged in user takes over
+ locale = locale || request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first if request.env['HTTP_ACCEPT_LANGUAGE']
+ I18n.locale = locale.nil? ? I18n.default_locale : (I18n::available_locales.include?(locale.to_sym) ? locale : I18n.default_locale)
+ logger.debug("Selected '#{I18n.locale}' as locale")
+ end
+
+ def set_session_expiration
+ # http://wiki.rubyonrails.com/rails/show/HowtoChangeSessionOptions
+ unless session == nil
+ return if self.controller_name == 'feed' or session['noexpiry'] == "on"
+ # If the method is called by the feed controller (which we don't have
+ # under session control) or if we checked the box to keep logged in on
+ # login don't set the session expiry time.
+ if session
+ # Get expiry time (allow ten seconds window for the case where we have
+ # none)
+ expiry_time = session['expiry_time'] || Time.now + 10
+ if expiry_time < Time.now
+ # Too late, matey... bang goes your session!
+ reset_session
+ else
+ # Okay, you get another hour
+ session['expiry_time'] = Time.now + (60*60)
+ end
+ end
+ end
+ end
+
+ # Redirects to change_password_user_path if the current user uses a
+ # deprecated password hashing algorithm.
+ def check_for_deprecated_password_hash
+ if current_user and current_user.uses_deprecated_password?
+ notify :warning, t('users.you_have_to_reset_your_password')
+ redirect_to change_password_user_path current_user
+ end
+ end
+
+ def render_failure message, status = 404
+ render :text => message, :status => status
+ end
+
+ # def rescue_action(exception)
+ # log_error(exception) if logger
+ # respond_to do |format|
+ # format.html do
+ # notify :warning, "An error occurred on the server."
+ # render :action => "index"
+ # end
+ # format.js { render :action => 'error' }
+ # format.xml { render :text => 'An error occurred on the server.' + $! }
+ # end
+ # end
+
+ # Returns a count of next actions in the given context or project The result
+ # is count and a string descriptor, correctly pluralised if there are no
+ # actions or multiple actions
+ #
+ def count_undone_todos_phrase(todos_parent)
+ count = count_undone_todos(todos_parent)
+ deferred_count = count_deferred_todos(todos_parent)
+ if count == 0 && deferred_count > 0
+ word = I18n.t('common.actions_midsentence', :count => deferred_count)
+ word = I18n.t('common.deferred') + " " + word
+ return deferred_count.to_s + " " + word
+ else
+ word = I18n.t('common.actions_midsentence', :count => count)
+ return count.to_s + " " + word
+ end
+ end
+
+ def count_undone_todos(todos_parent)
+ if todos_parent.nil?
+ count = 0
+ elsif (todos_parent.is_a?(Project) && todos_parent.hidden?)
+ count = eval "@project_project_hidden_todo_counts[#{todos_parent.id}]"
+ else
+ count = eval "@#{todos_parent.class.to_s.downcase}_not_done_counts[#{todos_parent.id}]"
+ end
+ count || 0
+ end
+
+ def count_deferred_todos(todos_parent)
+ if todos_parent.nil?
+ count = 0
+ else
+ count = todos_parent.todos.deferred.count
+ end
+ end
+
+ # Convert a date object to the format specified in the user's preferences in
+ # config/settings.yml
+ #
+ def format_date(date)
+ return date ? date.in_time_zone(prefs.time_zone).strftime("#{prefs.date_format}") : ''
+ end
+
+ def for_autocomplete(coll, substr)
+ if substr # protect agains empty request
+ filtered = coll.find_all{|item| item.name.downcase.include? substr.downcase}
+ json_elems = Array[*filtered.map{ |e| {:id => e.id.to_s, :value => e.name} }].to_json
+ return json_elems
+ else
+ return ""
+ end
+ end
+
+ def format_dependencies_as_json_for_auto_complete(entries)
+ json_elems = Array[*entries.map{ |e| {:value => e.id.to_s, :label => e.specification} }].to_json
+ return json_elems
+ end
+
+ # Here's the concept behind this "mobile content negotiation" hack: In
+ # addition to the main, AJAXy Web UI, Tracks has a lightweight low-feature
+ # 'mobile' version designed to be suitablef or use from a phone or PDA. It
+ # makes some sense that tne pages of that mobile version are simply alternate
+ # representations of the same Todo resources. The implementation goal was to
+ # treat mobile as another format and be able to use respond_to to render both
+ # versions. Unfortunately, I ran into a lot of trouble simply registering a
+ # new mime type 'text/html' with format :m because :html already is linked to
+ # that mime type and the new registration was forcing all html requests to be
+ # rendered in the mobile view. The before_filter and after_filter hackery
+ # below accomplishs that implementation goal by using a 'fake' mime type
+ # during the processing and then setting it to 'text/html' in an
+ # 'after_filter' -LKM 2007-04-01
+ def mobile?
+ return params[:format] == 'm'
+ end
+
+ def enable_mobile_content_negotiation
+ if mobile?
+ request.format = :m
+ end
+ end
+
+ def create_todo_from_recurring_todo(rt, date=nil)
+ # create todo and initialize with data from recurring_todo rt
+ todo = current_user.todos.build( { :description => rt.description, :notes => rt.notes, :project_id => rt.project_id, :context_id => rt.context_id})
+ todo.recurring_todo_id = rt.id
+
+ # set dates
+ todo.due = rt.get_due_date(date)
+
+ show_from_date = rt.get_show_from_date(date)
+ if show_from_date.nil?
+ todo.show_from=nil
+ else
+ # make sure that show_from is not in the past
+ todo.show_from = show_from_date < Time.zone.now ? nil : show_from_date
+ end
+
+ saved = todo.save
+ if saved
+ todo.tag_with(rt.tag_list)
+ todo.tags.reload
+ end
+
+ # increate number of occurences created from recurring todo
+ rt.inc_occurences
+
+ # mark recurring todo complete if there are no next actions left
+ checkdate = todo.due.nil? ? todo.show_from : todo.due
+ rt.toggle_completion! unless rt.has_next_todo(checkdate)
+
+ return saved ? todo : nil
+ end
+
+ def handle_unverified_request
+ unless request.format=="application/xml"
+ super # handle xml http auth via our own login code
+ end
+ end
+
+ protected
+
+ def admin_login_required
+ unless User.find_by_id_and_is_admin(session['user_id'], true)
+ render :text => t('errors.user_unauthorized'), :status => 401
+ return false
+ end
+ end
+
+ def redirect_back_or_home
+ respond_to do |format|
+ format.html { redirect_back_or_default home_url }
+ format.m { redirect_back_or_default mobile_url }
+ end
+ end
+
+ def boolean_param(param_name)
+ return false if param_name.blank?
+ s = params[param_name]
+ return false if s.blank? || s == false || s =~ /^false$/i
+ return true if s == true || s =~ /^true$/i
+ raise ArgumentError.new("invalid value for Boolean: \"#{s}\"")
+ end
+
+ def self.openid_enabled?
+ Tracks::Config.openid_enabled?
+ end
+
+ def openid_enabled?
+ self.class.openid_enabled?
+ end
+
+ def self.cas_enabled?
+ Tracks::Config.cas_enabled?
+ end
+
+ def cas_enabled?
+ self.class.cas_enabled?
+ end
+
+ def self.prefered_auth?
+ Tracks::Config.prefered_auth?
+ end
+
+ def prefered_auth?
+ self.class.prefered_auth?
+ end
+
+ # all completed todos [today@00:00, today@now]
+ def get_done_today(completed_todos, includes = {:include => Todo::DEFAULT_INCLUDES})
+ start_of_this_day = Time.zone.now.beginning_of_day
+ completed_todos.completed_after(start_of_this_day).all(includes)
+ end
+
+ # all completed todos [begin_of_week, start_of_today]
+ def get_done_this_week(completed_todos, includes = {:include => Todo::DEFAULT_INCLUDES})
+ start_of_this_week = Time.zone.now.beginning_of_week
+ start_of_this_day = Time.zone.now.beginning_of_day
+ completed_todos.completed_before(start_of_this_day).completed_after(start_of_this_week).all(includes)
+ end
+
+ # all completed todos [begin_of_month, begin_of_week]
+ def get_done_this_month(completed_todos, includes = {:include => Todo::DEFAULT_INCLUDES})
+ start_of_this_month = Time.zone.now.beginning_of_month
+ start_of_this_week = Time.zone.now.beginning_of_week
+ completed_todos.completed_before(start_of_this_week).completed_after(start_of_this_month).all(includes)
+ end
+
+ private
+
+ def parse_date_per_user_prefs( s )
+ prefs.parse_date(s)
+ end
+
+ def init_data_for_sidebar
+ @completed_projects = current_user.projects.completed
+ @hidden_projects = current_user.projects.hidden
+ @active_projects = current_user.projects.active
+
+ @active_contexts = current_user.contexts.active
+ @hidden_contexts = current_user.contexts.hidden
+
+ init_not_done_counts
+ if prefs.show_hidden_projects_in_sidebar
+ init_project_hidden_todo_counts(['project'])
+ end
+ end
+
+ def init_not_done_counts(parents = ['project','context'])
+ parents.each do |parent|
+ eval("@#{parent}_not_done_counts = @#{parent}_not_done_counts || current_user.todos.active.count(:group => :#{parent}_id)")
+ end
+ end
+
+ def init_project_hidden_todo_counts(parents = ['project','context'])
+ parents.each do |parent|
+ eval("@#{parent}_project_hidden_todo_counts = @#{parent}_project_hidden_todo_counts || current_user.todos.count(:conditions => ['state = ? or state = ?', 'project_hidden', 'active'], :group => :#{parent}_id)")
+ end
+ end
+
+ # Set the contents of the flash message from a controller Usage: notify
+ # :warning, "This is the message" Sets the flash of type 'warning' to "This is
+ # the message"
+ def notify(type, message)
+ flash[type] = message
+ logger.error("ERROR: #{message}") if type == :error
+ end
+
+ def set_time_zone
+ Time.zone = current_user.prefs.time_zone if logged_in?
+ end
+
+ def set_zindex_counter
+ # this counter can be used to handle the IE z-index bug
+ @z_index_counter = 500
+ end
+
+end
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 183b4c31..915c9f8e 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -1,5 +1,3 @@
-# The methods added to this helper will be available to all templates in the
-# application.
module ApplicationHelper
# Replicates the link_to method but also checks request.request_uri to find
diff --git a/app/helpers/application_helper.rb.rails2 b/app/helpers/application_helper.rb.rails2
new file mode 100644
index 00000000..39c591e4
--- /dev/null
+++ b/app/helpers/application_helper.rb.rails2
@@ -0,0 +1,301 @@
+# The methods added to this helper will be available to all templates in the
+# application.
+module ApplicationHelper
+
+ # Replicates the link_to method but also checks request.request_uri to find
+ # current page. If that matches the url, the link is marked id = "current"
+ #
+ def navigation_link(name, options = {}, html_options = nil, *parameters_for_method_reference)
+ if html_options
+ html_options = html_options.stringify_keys
+ convert_options_to_javascript!(html_options)
+ tag_options = tag_options(html_options)
+ else
+ tag_options = nil
+ end
+ url = options.is_a?(String) ? options : self.url_for(options, *parameters_for_method_reference)
+ id_tag = (request.request_uri == url) ? " id=\"current\"" : ""
+
+ "#{name || url}"
+ end
+
+ def days_from_today(date)
+ date.in_time_zone.to_date - current_user.time.to_date
+ end
+
+ # Check due date in comparison to today's date Flag up date appropriately with
+ # a 'traffic light' colour code
+ #
+ def due_date(due)
+ return "" if due.nil?
+
+ days = days_from_today(due)
+
+ colors = ['amber','amber','orange','orange','orange','orange','orange','orange']
+ color = :red if days < 0
+ color = :green if days > 7
+ color = colors[days] if color.nil?
+
+ return content_tag(:a, {:title => format_date(due)}) {
+ content_tag(:span, {:class => color}) {
+ case days
+ when 0
+ t('todos.next_actions_due_date.due_today')
+ when 1
+ t('todos.next_actions_due_date.due_tomorrow')
+ when 2..7
+ if prefs.due_style == Preference.due_styles[:due_on]
+ # TODO: internationalize strftime here
+ t('models.preference.due_on', :date => due.strftime("%A"))
+ else
+ t('models.preference.due_in', :days => days)
+ end
+ else
+ # overdue or due very soon! sound the alarm!
+ if days == -1
+ t('todos.next_actions_due_date.overdue_by', :days => days * -1)
+ elsif days < -1
+ t('todos.next_actions_due_date.overdue_by_plural', :days => days * -1)
+ else
+ # more than a week away - relax
+ t('models.preference.due_in', :days => days)
+ end
+ end
+ }
+ }
+ end
+
+ # Check due date in comparison to today's date Flag up date appropriately with
+ # a 'traffic light' colour code Modified method for mobile screen
+ #
+ def due_date_mobile(due)
+ if due == nil
+ return ""
+ end
+
+ days = days_from_today(due)
+
+ case days
+ when 0
+ ""+ format_date(due) + ""
+ when 1
+ "" + format_date(due) + ""
+ # due 2-7 days away
+ when 2..7
+ "" + format_date(due) + ""
+ else
+ # overdue or due very soon! sound the alarm!
+ if days < 0
+ "" + format_date(due) +""
+ else
+ # more than a week away - relax
+ "" + format_date(due) + ""
+ end
+ end
+ end
+
+ # Returns a count of next actions in the given context or project. The result
+ # is count and a string descriptor, correctly pluralised if there are no
+ # actions or multiple actions
+ #
+ def count_undone_todos_phrase(todos_parent, string="actions")
+ @controller.count_undone_todos_phrase(todos_parent, string)
+ end
+
+ def count_undone_todos_phrase_text(todos_parent, string="actions")
+ count_undone_todos_phrase(todos_parent, string).gsub(" "," ")
+ end
+
+ def count_undone_todos_and_notes_phrase(project, string="actions")
+ s = count_undone_todos_phrase(project, string)
+ s += ", #{pluralize(project.note_count, 'note')}" unless project.note_count == 0
+ s
+ end
+
+ def link_to_context(context, descriptor = sanitize(context.name))
+ link_to( descriptor, context, :title => "View context: #{context.name}" )
+ end
+
+ def link_to_project(project, descriptor = sanitize(project.name))
+ link_to( descriptor, project, :title => "View project: #{project.name}" )
+ end
+
+ def link_to_edit_note (note, descriptor = sanitize(note.id.to_s))
+ link_to(descriptor,
+ url_for({:controller => 'notes', :action => 'edit', :id => note.id}),
+ {:id => "link_edit_#{dom_id(note)}", :class => "note_edit_settings"})
+ end
+
+ def link_to_project_mobile(project, accesskey, descriptor = sanitize(project.name))
+ link_to( descriptor, project_path(project, :format => 'm'), {:title => "View project: #{project.name}", :accesskey => accesskey} )
+ end
+
+ def item_link_to_context(item)
+ descriptor = "[C]"
+ descriptor = "[#{item.context.name}]" if prefs.verbose_action_descriptors
+ link_to_context( item.context, descriptor )
+ end
+
+ def item_link_to_project(item)
+ descriptor = "[P]"
+ descriptor = "[#{item.project.name}]" if prefs.verbose_action_descriptors
+ link_to_project( item.project, descriptor )
+ end
+
+ def render_flash
+ render :partial => 'shared/flash', :object => flash
+ end
+
+ def recurrence_time_span(rt)
+ case rt.ends_on
+ when "no_end_date"
+ return rt.start_from.nil? ? "" : I18n.t("todos.recurrence.pattern.from") + " " + format_date(rt.start_from)
+ when "ends_on_number_of_times"
+ return I18n.t("todos.recurrence.pattern.times", :number => rt.number_of_occurences)
+ when "ends_on_end_date"
+ starts = rt.start_from.nil? ? "" : I18n.t("todos.recurrence.pattern.from") + " " + format_date(rt.start_from)
+ ends = rt.end_date.nil? ? "" : " " + I18n.t("todos.recurrence.pattern.until") + " " + format_date(rt.end_date)
+ return starts+ends
+ else
+ raise Exception.new, "unknown recurrence time span selection (#{rt.ends_on})"
+ end
+ end
+
+ def recurrence_pattern_as_text(recurring_todo)
+ rt = recurring_todo.recurring_target_as_text
+ rp = recurring_todo.recurrence_pattern
+ # only add space if recurrence_pattern has content
+ rp = " " + rp if !rp.nil?
+ rts = recurrence_time_span(recurring_todo)
+ # only add space if recurrence_time_span has content
+ rts = " " + rts if !(rts == "")
+ return rt+rp+rts
+ end
+
+ def date_format_for_date_picker()
+ standard_format = current_user.prefs.date_format
+ translations = [
+ ['%m', 'mm'],
+ ['%b', 'M'],
+ ['%B', 'MM'],
+ ['%d', 'dd'],
+ ['%a', 'D'],
+ ['%A', 'DD'],
+ ['%y', 'y'],
+ ['%Y', 'yy']
+ ]
+ translations.inject(standard_format) do |str, translation|
+ str.gsub(*translation)
+ end
+ end
+
+ AUTO_LINK_MESSAGE_RE = %r{message://<[^>]+>} unless const_defined?(:AUTO_LINK_MESSAGE_RE)
+
+ # Converts message:// links to href. This URL scheme is used on Mac OS X
+ # to link to a mail message in Mail.app.
+ def auto_link_message(text)
+ text.gsub(AUTO_LINK_MESSAGE_RE) do
+ href = $&
+ left, right = $`, $'
+ # detect already linked URLs and URLs in the middle of a tag
+ if left =~ /<[^>]+$/ && right =~ /^[^>]*>/
+ # do not change string; URL is alreay linked
+ href
+ else
+ content = content_tag(:a, h(href), :href => h(href))
+ end
+ end
+ end
+
+ def format_note(note)
+ note = auto_link_message(note)
+ note = markdown(note)
+ note = auto_link(note, :link => :urls)
+
+ # add onenote and message protocols
+ Sanitize::Config::RELAXED[:protocols]['a']['href'] << 'onenote'
+ Sanitize::Config::RELAXED[:protocols]['a']['href'] << 'message'
+
+ note = Sanitize.clean(note, Sanitize::Config::RELAXED)
+ return note
+ end
+
+ def sidebar_html_for_titled_list (list, title)
+ return content_tag(:h3, title+" (#{list.length})") +
+ content_tag(:ul, sidebar_html_for_list(list))
+ end
+
+ def sidebar_html_for_list(list)
+ if list.empty?
+ return content_tag(:li, t('sidebar.list_empty'))
+ else
+ return list.inject("") do |html, item|
+ link = (item.class == "Project") ? link_to_project( item ) : link_to_context(item)
+ html << content_tag(:li, link + " (" + count_undone_todos_phrase(item,"actions")+")")
+ end
+ end
+ end
+
+ def generate_i18n_strings
+ js = "i18n_locale='#{I18n.locale}';\n"
+ js << "i18n = new Array();\n"
+ %w{
+ shared.toggle_multi shared.toggle_multi_title
+ shared.hide_form shared.hide_action_form_title
+ shared.toggle_single shared.toggle_single_title
+ projects.hide_form projects.hide_form_title
+ projects.show_form projects.show_form_title
+ contexts.hide_form contexts.hide_form_title
+ contexts.show_form contexts.show_form_title
+ contexts.new_context_pre contexts.new_context_post
+ common.cancel common.ok
+ common.ajaxError todos.unresolved_dependency
+ }.each do |s|
+ js << "i18n['#{s}'] = '#{ t(s).gsub(/'/, "\\\\'") }';\n"
+ end
+ return js
+ end
+
+ def javascript_tag_for_i18n_datepicker
+ locale = I18n.locale
+ # do not include en as locale since this the available by default
+ if locale and locale != :en
+ javascript_include_tag("i18n/jquery.ui.datepicker-#{locale}.js")
+ end
+ end
+
+ def determine_done_path
+ case @controller.controller_name
+ when "contexts"
+ done_todos_context_path(@context)
+ when "projects"
+ done_todos_project_path(@project)
+ when "todos"
+ if source_view_is(:tag)
+ done_tag_path(@tag_name)
+ else
+ done_todos_path
+ end
+ else
+ done_todos_path
+ end
+ end
+
+ def determine_all_done_path
+ case @controller.controller_name
+ when "contexts"
+ all_done_todos_context_path(@context)
+ when "projects"
+ all_done_todos_project_path(@project)
+ when "todos"
+ if source_view_is(:tag)
+ all_done_tag_path(@tag_name)
+ else
+ all_done_todos_path
+ end
+ else
+ all_done_todos_path
+ end
+ end
+
+end
diff --git a/app/mailers/.gitkeep b/app/mailers/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/app/models/.gitkeep b/app/models/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb
new file mode 100644
index 00000000..d29802cd
--- /dev/null
+++ b/app/views/layouts/application.html.erb
@@ -0,0 +1,14 @@
+
+
+
+ Tracksapp
+ <%= stylesheet_link_tag "application", :media => "all" %>
+ <%= javascript_include_tag "application" %>
+ <%= csrf_meta_tags %>
+
+
+
+<%= yield %>
+
+
+
diff --git a/config.ru b/config.ru
new file mode 100644
index 00000000..7ed77ad6
--- /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 Tracksapp::Application
diff --git a/config/application.rb b/config/application.rb
new file mode 100644
index 00000000..9455b87e
--- /dev/null
+++ b/config/application.rb
@@ -0,0 +1,59 @@
+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 Tracksapp
+ 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]
+
+ # Use SQL instead of Active Record's schema dumper when creating the 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
+
+ # Enforce whitelist mode for mass assignment.
+ # This will create an empty whitelist of attributes available for mass-assignment for all models
+ # in your app. As such, your models will need to explicitly whitelist or blacklist accessible
+ # parameters by using an attr_accessible or attr_protected declaration.
+ config.active_record.whitelist_attributes = true
+
+ # 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
index 57528ecc..4489e586 100644
--- a/config/boot.rb
+++ b/config/boot.rb
@@ -1,128 +1,6 @@
-# Don't change this file!
-# Configure your app in config/environment.rb and config/environments/*.rb
+require 'rubygems'
-RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
+# Set up gems listed in the Gemfile.
+ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
-module Rails
- class << self
- def boot!
- unless booted?
- preinitialize
- pick_boot.run
- end
- end
-
- def booted?
- defined? Rails::Initializer
- end
-
- def pick_boot
- (vendor_rails? ? VendorBoot : GemBoot).new
- end
-
- def vendor_rails?
- File.exist?("#{RAILS_ROOT}/vendor/rails")
- end
-
- def preinitialize
- load(preinitializer_path) if File.exist?(preinitializer_path)
- end
-
- def preinitializer_path
- "#{RAILS_ROOT}/config/preinitializer.rb"
- end
- end
-
- class Boot
- def run
- load_initializer
- Rails::Initializer.run(:set_load_path)
- end
- end
-
- class VendorBoot < Boot
- def load_initializer
- require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
- Rails::Initializer.run(:install_gem_spec_stubs)
- Rails::GemDependency.add_frozen_gem_path
- end
- end
-
- class GemBoot < Boot
- def load_initializer
- self.class.load_rubygems
- load_rails_gem
- require 'initializer'
- end
-
- def load_rails_gem
- if version = self.class.gem_version
- gem 'rails', version
- else
- gem 'rails'
- end
- rescue Gem::LoadError => load_error
- if load_error.message =~ /Could not find RubyGem rails/
- STDERR.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
- exit 1
- else
- raise
- end
- end
-
- class << self
- def rubygems_version
- Gem::RubyGemsVersion rescue nil
- end
-
- def gem_version
- if defined? RAILS_GEM_VERSION
- RAILS_GEM_VERSION
- elsif ENV.include?('RAILS_GEM_VERSION')
- ENV['RAILS_GEM_VERSION']
- else
- parse_gem_version(read_environment_rb)
- end
- end
-
- def load_rubygems
- min_version = '1.3.2'
- require 'rubygems'
- unless rubygems_version >= min_version
- $stderr.puts %Q(Rails requires RubyGems >= #{min_version} (you have #{rubygems_version}). Please `gem update --system` and try again.)
- exit 1
- end
-
- rescue LoadError
- $stderr.puts %Q(Rails requires RubyGems >= #{min_version}. Please install RubyGems and try again: http://rubygems.rubyforge.org)
- exit 1
- end
-
- def parse_gem_version(text)
- $1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/
- end
-
- private
- def read_environment_rb
- File.read("#{RAILS_ROOT}/config/environment.rb")
- end
- end
- end
-end
-
-class Rails::Boot
- def run
- load_initializer
-
- Rails::Initializer.class_eval do
- def load_gems
- @bundler_loaded ||= Bundler.require :default, Rails.env
- end
- end
-
- Rails::Initializer.run(:set_load_path)
- end
-end
-
-# All that for this:
-Rails.boot!
+require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
diff --git a/config/database.yml.rails2 b/config/database.yml.rails2
new file mode 100644
index 00000000..da7aebc8
--- /dev/null
+++ b/config/database.yml.rails2
@@ -0,0 +1,37 @@
+# MySQL. Versions 4.1 and 5.0 are recommended.
+#
+#
+# Be sure to use new-style password hashing:
+# http://dev.mysql.com/doc/refman/5.0/en/old-client.html
+development:
+ adapter: mysql
+ database: tracks_trunk
+ encoding: utf8
+ host: localhost
+ username: tracks
+ password: 32tracks55
+
+mdevelopment:
+ adapter: sqlite3
+ database: db/tracks-21-test.sqlite3.db
+
+test: &TEST
+# adapter: sqlite3
+# database: ":memory:"
+# verbosity: quiet
+ adapter: mysql
+ database: tracks_test
+ host: localhost
+ username: tracks
+ password: 32tracks55
+
+production:
+ adapter: mysql
+ database: tracks_trunk
+ encoding: utf8
+ host: localhost
+ username: tracks
+ password: 32tracks55
+
+cucumber:
+ <<: *TEST
diff --git a/config/environment.rb b/config/environment.rb
index fcb6fed8..8e8e1fdb 100644
--- a/config/environment.rb
+++ b/config/environment.rb
@@ -1,118 +1,5 @@
-# Be sure to restart your webserver when you modify this file.
-# Uncomment below to force Rails into production mode
+# Load the rails application
+require File.expand_path('../application', __FILE__)
-# (Use only when you can't set environment variables through your web/app server)
-# ENV['RAILS_ENV'] = 'production'
-
-# Bootstrap the Rails environment, frameworks, and default configuration
-require File.join(File.dirname(__FILE__), 'boot')
-
-require 'yaml'
-SITE_CONFIG = YAML.load_file(File.join(File.dirname(__FILE__), 'site.yml'))
-
-class Rails::Configuration
- attr_accessor :action_web_service
-end
-
-Encoding.default_external = Encoding::UTF_8 if RUBY_VERSION > "1.9"
-
-Rails::Initializer.run do |config|
- # Skip frameworks you're not going to use
- # config.frameworks -= [ :action_web_service, :action_mailer ]
- config.autoload_paths += %W( #{RAILS_ROOT}/app/apis )
-
- config.action_controller.use_accept_header = true
-
- # Use the database for sessions instead of the file system
- # (create the session table with 'rake create_sessions_table')
- config.action_controller.session_store = :active_record_store
-
- config.action_controller.session = {
- :key => '_tracks_session_id',
- :secret => SITE_CONFIG['salt'] * (30.0 / SITE_CONFIG['salt'].length).ceil #must be at least 30 characters
- }
-
- config.action_controller.relative_url_root = SITE_CONFIG['subdir'] if SITE_CONFIG['subdir']
-
- # Enable page/fragment caching by setting a file-based store
- # (remember to create the caching directory and make it readable to the application)
- # config.action_controller.fragment_cache_store = :file_store, "#{RAILS_ROOT}/cache"
-
- # Activate observers that should always be running
- # config.active_record.observers = :cacher, :garbage_collector
-
- # Make Active Record use UTC-base instead of local time
- config.active_record.default_timezone = :utc
-
- # You''ll probably want to change this to the time zone of the computer where Tracks is running
- # run rake time:zones:local have Rails suggest time zone names on your system
- config.time_zone = SITE_CONFIG['time_zone']
-
- # Use Active Record's schema dumper instead of SQL when creating the test database
- # (enables use of different database adapters for development and test environments)
- config.active_record.schema_format = :ruby
-
- # allow other protocols in urls for sanitzer. Add to your liking, for example
- # config.action_view.sanitized_allowed_protocols = 'onenote', 'blah', 'proto'
- # to enable "link":onenote://... or "link":blah://... hyperlinks
- config.action_view.sanitized_allowed_protocols = 'onenote', 'message'
-
- # 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
-
-end
-
-# Add new inflection rules using the following format
-# (all these examples are active by default):
-# 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
-
-# Include your application configuration below
-
-
-require 'name_part_finder'
-require 'tracks/todo_list'
-require 'tracks/config'
-require 'digest/sha1' #Needed to support 'rake db:fixtures:load' on some ruby installs: http://dev.rousette.org.uk/ticket/557
-
-if ( SITE_CONFIG['authentication_schemes'].include? 'ldap')
- require 'net/ldap' #requires ruby-net-ldap gem be installed
- require 'simple_ldap_authenticator'
- ldap = SITE_CONFIG['ldap']
- SimpleLdapAuthenticator.ldap_library = ldap['library']
- SimpleLdapAuthenticator.servers = ldap['servers']
- SimpleLdapAuthenticator.use_ssl = ldap['ssl']
- SimpleLdapAuthenticator.login_format = ldap['login_format']
-end
-
-if ( SITE_CONFIG['authentication_schemes'].include? 'open_id')
- #requires ruby-openid gem to be installed
- OpenID::Util.logger = RAILS_DEFAULT_LOGGER
-end
-
-if ( SITE_CONFIG['authentication_schemes'].include? 'cas')
- #requires rubycas-client gem to be installed
- if defined? CASClient
- require 'casclient/frameworks/rails/filter'
- CASClient::Frameworks::Rails::Filter.configure(
- :cas_base_url => SITE_CONFIG['cas_server'] ,
- :cas_server_logout => SITE_CONFIG['cas_server_logout']
- )
- end
-end
-
-# changed in development.rb to show under_construction bar
-NOTIFY_BAR = "" unless defined?(NOTIFY_BAR)
-
-tracks_version='2.2devel'
-# comment out next two lines if you do not want (or can not) the date of the
-# last git commit in the footer
-info=`git log --pretty=format:"%ai" -1`
-tracks_version=tracks_version + ' ('+info+')'
-
-TRACKS_VERSION=tracks_version
+# Initialize the rails application
+Tracksapp::Application.initialize!
diff --git a/config/environment.rb.rails2 b/config/environment.rb.rails2
new file mode 100644
index 00000000..390f585b
--- /dev/null
+++ b/config/environment.rb.rails2
@@ -0,0 +1,119 @@
+# Be sure to restart your webserver when you modify this file.
+# Uncomment below to force Rails into production mode
+
+# (Use only when you can't set environment variables through your web/app server)
+# ENV['RAILS_ENV'] = 'production'
+
+# Bootstrap the Rails environment, frameworks, and default configuration
+require File.join(File.dirname(__FILE__), 'boot')
+
+require 'yaml'
+SITE_CONFIG = YAML.load_file(File.join(File.dirname(__FILE__), 'site.yml'))
+
+class Rails::Configuration
+ attr_accessor :action_web_service
+end
+
+Encoding.default_external = Encoding::UTF_8 if RUBY_VERSION > "1.9"
+
+Rails::Initializer.run do |config|
+ # Skip frameworks you're not going to use
+ # config.frameworks -= [ :action_web_service, :action_mailer ]
+ config.autoload_paths += %W( #{RAILS_ROOT}/app/apis )
+
+ config.action_controller.use_accept_header = true
+
+ # Use the database for sessions instead of the file system
+ # (create the session table with 'rake create_sessions_table')
+ config.action_controller.session_store = :active_record_store
+
+ config.action_controller.session = {
+ :key => '_tracks_session_id',
+ :secret => SITE_CONFIG['salt'] * (30.0 / SITE_CONFIG['salt'].length).ceil #must be at least 30 characters
+ }
+
+ config.action_controller.relative_url_root = SITE_CONFIG['subdir'] if SITE_CONFIG['subdir']
+
+ # Enable page/fragment caching by setting a file-based store
+ # (remember to create the caching directory and make it readable to the application)
+ # config.action_controller.fragment_cache_store = :file_store, "#{RAILS_ROOT}/cache"
+
+ # Activate observers that should always be running
+ # config.active_record.observers = :cacher, :garbage_collector
+
+ # Make Active Record use UTC-base instead of local time
+ config.active_record.default_timezone = :utc
+
+ # You''ll probably want to change this to the time zone of the computer where Tracks is running
+ # run rake time:zones:local have Rails suggest time zone names on your system
+ config.time_zone = SITE_CONFIG['time_zone']
+
+ # Use Active Record's schema dumper instead of SQL when creating the test database
+ # (enables use of different database adapters for development and test environments)
+ config.active_record.schema_format = :ruby
+
+ # allow other protocols in urls for sanitzer. Add to your liking, for example
+ # config.action_view.sanitized_allowed_protocols = 'onenote', 'blah', 'proto'
+ # to enable "link":onenote://... or "link":blah://... hyperlinks
+ config.action_view.sanitized_allowed_protocols = 'onenote', 'message'
+
+ # 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
+
+end
+
+# Add new inflection rules using the following format
+# (all these examples are active by default):
+# 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
+
+# Include your application configuration below
+
+
+require 'name_part_finder'
+require 'tracks/todo_list'
+require 'tracks/config'
+require 'tagging_extensions' # Needed for tagging-specific extensions
+require 'digest/sha1' #Needed to support 'rake db:fixtures:load' on some ruby installs: http://dev.rousette.org.uk/ticket/557
+
+if ( SITE_CONFIG['authentication_schemes'].include? 'ldap')
+ require 'net/ldap' #requires ruby-net-ldap gem be installed
+ require 'simple_ldap_authenticator'
+ ldap = SITE_CONFIG['ldap']
+ SimpleLdapAuthenticator.ldap_library = ldap['library']
+ SimpleLdapAuthenticator.servers = ldap['servers']
+ SimpleLdapAuthenticator.use_ssl = ldap['ssl']
+ SimpleLdapAuthenticator.login_format = ldap['login_format']
+end
+
+if ( SITE_CONFIG['authentication_schemes'].include? 'open_id')
+ #requires ruby-openid gem to be installed
+ OpenID::Util.logger = RAILS_DEFAULT_LOGGER
+end
+
+if ( SITE_CONFIG['authentication_schemes'].include? 'cas')
+ #requires rubycas-client gem to be installed
+ if defined? CASClient
+ require 'casclient/frameworks/rails/filter'
+ CASClient::Frameworks::Rails::Filter.configure(
+ :cas_base_url => SITE_CONFIG['cas_server'] ,
+ :cas_server_logout => SITE_CONFIG['cas_server_logout']
+ )
+ end
+end
+
+# changed in development.rb to show under_construction bar
+NOTIFY_BAR = "" unless defined?(NOTIFY_BAR)
+
+tracks_version='2.2devel'
+# comment out next two lines if you do not want (or can not) the date of the
+# last git commit in the footer
+info=`git log --pretty=format:"%ai" -1`
+tracks_version=tracks_version + ' ('+info+')'
+
+TRACKS_VERSION=tracks_version
diff --git a/config/environments/development.rb b/config/environments/development.rb
index 05c880d7..8a835a34 100644
--- a/config/environments/development.rb
+++ b/config/environments/development.rb
@@ -1,19 +1,37 @@
-# 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 webserver when you make code changes.
-config.cache_classes = false
+Tracksapp::Application.configure do
+ # Settings specified here will take precedence over those in config/application.rb
-# Log error messages when you accidentally call methods on nil.
-config.whiny_nils = true
+ # 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
-# Show full error reports and disable caching
-config.action_controller.consider_all_requests_local = true
-config.action_controller.perform_caching = false
+ # Log error messages when you accidentally call methods on nil.
+ config.whiny_nils = true
-# Don't care if the mailer can't send
-config.action_mailer.raise_delivery_errors = false
+ # Show full error reports and disable caching
+ config.consider_all_requests_local = true
+ config.action_controller.perform_caching = false
-# Unique cookies
-config.action_controller.session = { :key => 'TracksDev' }
+ # Don't care if the mailer can't send
+ config.action_mailer.raise_delivery_errors = false
-NOTIFY_BAR="
"
+ # 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
+
+ # Raise exception on mass assignment protection for Active Record models
+ config.active_record.mass_assignment_sanitizer = :strict
+
+ # Log the query plan for queries taking more than this (works
+ # with SQLite, MySQL, and PostgreSQL)
+ config.active_record.auto_explain_threshold_in_seconds = 0.5
+
+ # Do not compress assets
+ config.assets.compress = false
+
+ # Expands the lines which load the assets
+ config.assets.debug = true
+end
diff --git a/config/environments/development.rb.rails2 b/config/environments/development.rb.rails2
new file mode 100644
index 00000000..05c880d7
--- /dev/null
+++ b/config/environments/development.rb.rails2
@@ -0,0 +1,19 @@
+# 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 webserver 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.action_controller.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
+
+# Unique cookies
+config.action_controller.session = { :key => 'TracksDev' }
+
+NOTIFY_BAR="
"
diff --git a/config/environments/production.rb b/config/environments/production.rb
index 56470f47..e43b1775 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -1,17 +1,67 @@
-# The production environment is meant for finished, "live" apps.
-# Code is not reloaded between requests
-config.cache_classes = true
+Tracksapp::Application.configure do
+ # Settings specified here will take precedence over those in config/application.rb
-# Use a different logger for distributed setups
-# config.logger = SyslogLogger.new
+ # 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
-# Full error reports are disabled and caching is turned on
-config.action_controller.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
-# Enable serving of images, stylesheets, and javascripts from an asset server
-# config.action_controller.asset_host = "http://assets.example.com"
+ # Compress JavaScripts and CSS
+ config.assets.compress = true
-# Disable delivery errors if you bad email addresses should just be ignored
-# config.action_mailer.raise_delivery_errors = false
\ No newline at end of file
+ # 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
+
+ # Prepend all log lines with the following tags
+ # config.log_tags = [ :subdomain, :uuid ]
+
+ # Use a different logger for distributed setups
+ # config.logger = ActiveSupport::TaggedLogging.new(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
+
+ # Log the query plan for queries taking more than this (works
+ # with SQLite, MySQL, and PostgreSQL)
+ # config.active_record.auto_explain_threshold_in_seconds = 0.5
+end
diff --git a/config/environments/production.rb.rails2 b/config/environments/production.rb.rails2
new file mode 100644
index 00000000..56470f47
--- /dev/null
+++ b/config/environments/production.rb.rails2
@@ -0,0 +1,17 @@
+# The production environment is meant for finished, "live" apps.
+# Code is not reloaded between requests
+config.cache_classes = true
+
+# Use a different logger for distributed setups
+# config.logger = SyslogLogger.new
+
+
+# Full error reports are disabled and caching is turned on
+config.action_controller.consider_all_requests_local = false
+config.action_controller.perform_caching = true
+
+# Enable serving of images, stylesheets, and javascripts from an asset server
+# config.action_controller.asset_host = "http://assets.example.com"
+
+# Disable delivery errors if you bad email addresses should just be ignored
+# config.action_mailer.raise_delivery_errors = false
\ No newline at end of file
diff --git a/config/environments/test.rb b/config/environments/test.rb
index 2b031cb9..76646cb2 100644
--- a/config/environments/test.rb
+++ b/config/environments/test.rb
@@ -1,33 +1,37 @@
-# 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
+Tracksapp::Application.configure do
+ # Settings specified here will take precedence over those in config/application.rb
-# Log error messages when you accidentally call methods on nil.
-config.whiny_nils = true
+ # 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
-# Show full error reports and disable caching
-config.action_controller.consider_all_requests_local = true
-config.action_controller.perform_caching = false
+ # Configure static asset server for tests with Cache-Control for performance
+ config.serve_static_assets = true
+ config.static_cache_control = "public, max-age=3600"
-# Tell ActionMailer 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
+ # Log error messages when you accidentally call methods on nil
+ config.whiny_nils = true
-# Disable request forgery protection in test environment
-config.action_controller.allow_forgery_protection = false
+ # Show full error reports and disable caching
+ config.consider_all_requests_local = true
+ config.action_controller.perform_caching = false
-# Unique cookies and use cookies for session
-config.action_controller.session_store = :cookie_store
-config.action_controller.session = { :key => 'TracksTest', :secret => SITE_CONFIG['salt'] * (30.0 / SITE_CONFIG['salt'].length).ceil }
+ # Raise exceptions instead of rendering exception templates
+ config.action_dispatch.show_exceptions = false
-# Overwrite the default settings for fixtures in tests. See Fixtures
-# for more details about these settings.
-# config.transactional_fixtures = true
-# config.instantiated_fixtures = false
-# config.pre_loaded_fixtures = false
-SITE_CONFIG['salt'] ||= 'change-me'
+ # Disable request forgery protection in test environment
+ config.action_controller.allow_forgery_protection = false
-config.time_zone = 'UTC'
+ # 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
+
+ # Raise exception on mass assignment protection for Active Record models
+ config.active_record.mass_assignment_sanitizer = :strict
+
+ # Print deprecation notices to the stderr
+ config.active_support.deprecation = :stderr
+end
diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb
index c2169ed0..59385cdf 100644
--- a/config/initializers/backtrace_silencers.rb
+++ b/config/initializers/backtrace_silencers.rb
@@ -3,5 +3,5 @@
# 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 do debug a problem that might steem from framework code.
-# Rails.backtrace_cleaner.remove_silencers!
\ No newline at end of file
+# 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/inflections.rb b/config/initializers/inflections.rb
index d531b8bb..5d8d9be2 100644
--- a/config/initializers/inflections.rb
+++ b/config/initializers/inflections.rb
@@ -1,6 +1,6 @@
# Be sure to restart your server when you modify this file.
-# Add new inflection rules using the following format
+# 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'
@@ -8,3 +8,8 @@
# inflect.irregular 'person', 'people'
# inflect.uncountable %w( fish sheep )
# end
+#
+# These inflection rules are supported but not enabled by default:
+# ActiveSupport::Inflector.inflections do |inflect|
+# inflect.acronym 'RESTful'
+# end
diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb
index 9b1d568c..da62ea3e 100644
--- a/config/initializers/mime_types.rb
+++ b/config/initializers/mime_types.rb
@@ -1,5 +1,8 @@
+# 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 "application/x-mobile", :mobile
+# Mime::Type.register_alias "text/html", :iphone
+
Mime::Type.register_alias "text/html", :m
Mime::Type.register_alias "text/plain", :autocomplete
diff --git a/config/initializers/secret_token.rb b/config/initializers/secret_token.rb
new file mode 100644
index 00000000..40e49e58
--- /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.
+Tracksapp::Application.config.secret_token = '978c88b98f3b7885b2e88a831545bd3c5d80d0f528b32096dafa7dc9010b2180e2391c059c5347a244709a2257e3d13f0841fbdc56e8052af3c3396916b5805b'
diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb
new file mode 100644
index 00000000..deb11eee
--- /dev/null
+++ b/config/initializers/session_store.rb
@@ -0,0 +1,8 @@
+# Be sure to restart your server when you modify this file.
+
+Tracksapp::Application.config.session_store :cookie_store, key: '_tracksapp_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")
+# Tracksapp::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 00000000..999df201
--- /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/routes.rb b/config/routes.rb
index ec0ed738..2d76d3dd 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,113 +1,58 @@
-ActionController::Routing::Routes.draw do |map|
- map.resources :users,
- :member => {:change_password => :get, :update_password => :post,
- :change_auth_type => :get, :update_auth_type => :post, :complete => :get,
- :refresh_token => :post }
+Tracksapp::Application.routes.draw do
+ # The priority is based upon order of creation:
+ # first created -> highest priority.
- map.with_options :controller => :users do |users|
- users.signup 'signup', :action => "new"
- end
+ # Sample of regular route:
+ # match 'products/:id' => 'catalog#view'
+ # Keep in mind you can assign values other than :controller and :action
- map.resources :contexts, :collection => {:order => :post, :done => :get}, :member => {:done_todos => :get, :all_done_todos => :get} do |contexts|
- contexts.resources :todos, :name_prefix => "context_"
- end
+ # Sample of named route:
+ # match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase
+ # This route can be invoked with purchase_url(:id => product.id)
- map.resources :projects,
- :collection => {:order => :post, :alphabetize => :post, :actionize => :post, :done => :get},
- :member => {:done_todos => :get, :all_done_todos => :get, :set_reviewed => :get} do |projects|
- projects.resources :todos, :name_prefix => "project_"
- end
+ # Sample resource route (maps HTTP verbs to controller actions automatically):
+ # resources :products
- map.with_options :controller => :projects do |projects|
- projects.review 'review', :action => :review
- end
+ # Sample resource route with options:
+ # resources :products do
+ # member do
+ # get 'short'
+ # post 'toggle'
+ # end
+ #
+ # collection do
+ # get 'sold'
+ # end
+ # end
- map.resources :notes
+ # Sample resource route with sub-resources:
+ # resources :products do
+ # resources :comments, :sales
+ # resource :seller
+ # end
- map.resources :todos,
- :member => {:toggle_check => :put, :toggle_star => :put, :defer => :put},
- :collection => {:check_deferred => :post, :filter_to_context => :post, :filter_to_project => :post, :done => :get, :all_done => :get
- }
+ # Sample resource route with more complex sub-resources
+ # resources :products do
+ # resources :comments
+ # resources :sales do
+ # get 'recent', :on => :collection
+ # end
+ # end
- map.with_options :controller => :todos do |todos|
- todos.home '', :action => "index"
- todos.tickler 'tickler.:format', :action => "list_deferred"
- todos.mobile_tickler 'tickler.m', :action => "list_deferred", :format => 'm'
+ # Sample resource route within a namespace:
+ # namespace :admin do
+ # # Directs /admin/products/* to Admin::ProductsController
+ # # (app/controllers/admin/products_controller.rb)
+ # resources :products
+ # end
- # This route works for tags with dots like /todos/tag/version1.5
- # please note that this pattern consumes everything after /todos/tag
- # so /todos/tag/version1.5.xml will result in :name => 'version1.5.xml'
- # UPDATE: added support for mobile view. All tags ending on .m will be
- # routed to mobile view of tags.
- todos.mobile_tag 'todos/tag/:name.m', :action => "tag", :format => 'm'
- todos.text_tag 'todos/tag/:name.txt', :action => "tag", :format => 'txt'
- todos.tag 'todos/tag/:name', :action => "tag", :name => /.*/
- todos.done_tag 'todos/done/tag/:name', :action => "done_tag"
- todos.all_done_tag 'todos/all_done/tag/:name', :action => "all_done_tag"
+ # You can have the root of your site routed with "root"
+ # just remember to delete public/index.html.
+ # root :to => 'welcome#index'
- todos.tags 'tags.autocomplete', :action => "tags", :format => 'autocomplete'
- todos.auto_complete_for_predecessor 'auto_complete_for_predecessor', :action => 'auto_complete_for_predecessor'
-
- todos.calendar 'calendar.ics', :action => "calendar", :format => 'ics'
- todos.calendar 'calendar.xml', :action => "calendar", :format => 'xml'
- todos.calendar 'calendar', :action => "calendar"
-
- todos.hidden 'hidden.xml', :action => "list_hidden", :format => 'xml'
-
- todos.mobile 'mobile', :action => "index", :format => 'm'
- todos.mobile_abbrev 'm', :action => "index", :format => 'm'
- todos.mobile_abbrev_new 'm/new', :action => "new", :format => 'm'
-
- todos.mobile_todo_show_notes 'todos/notes/:id.m', :action => "show_notes", :format => 'm'
- todos.todo_show_notes 'todos/notes/:id', :action => "show_notes"
- todos.done_todos 'todos/done', :action => :done
- todos.all_done_todos 'todos/all_done', :action => :all_done
- end
- map.root :controller => 'todos' # Make OpenID happy because it needs #root_url defined
-
- map.resources :recurring_todos, :collection => {:done => :get},
- :member => {:toggle_check => :put, :toggle_star => :put}
- map.with_options :controller => :recurring_todos do |rt|
- rt.recurring_todos 'recurring_todos', :action => 'index'
- end
-
- map.with_options :controller => :login do |login|
- login.login 'login', :action => 'login'
- login.login_cas 'login_cas', :action => 'login_cas'
- login.formatted_login 'login.:format', :action => 'login'
- login.logout 'logout', :action => 'logout'
- login.formatted_logout 'logout.:format', :action => 'logout'
- end
-
- map.with_options :controller => :feedlist do |fl|
- fl.mobile_feeds 'feeds.m', :action => 'index', :format => 'm'
- fl.feeds 'feeds', :action => 'index'
- end
-
- map.with_options :controller => :integrations do |i|
- i.integrations 'integrations', :action => 'index'
- i.rest_api_docs 'integrations/rest_api', :action => "rest_api"
- i.search_plugin 'integrations/search_plugin.xml', :action => 'search_plugin', :format => 'xml'
- i.google_gadget 'integrations/google_gadget.xml', :action => 'google_gadget', :format => 'xml'
- i.cloudmailin 'integrations/cloudmailin', :action => 'cloudmailin'
- end
-
- map.with_options :controller => :preferences do |p|
- p.preferences 'preferences', :action => 'index'
- p.preferences_date_format 'preferences/render_date_format', :action => 'render_date_format'
- end
-
- map.with_options :controller => :stats do |stats|
- stats.stats 'stats', :action => 'index'
- stats.done_overview 'done', :action => 'done'
- end
-
- map.search 'search', :controller => 'search', :action => 'index'
- map.data 'data', :controller => 'data', :action => 'index'
-
- Translate::Routes.translation_ui(map) if Rails.env != "production"
-
- # Install the default route as the lowest priority.
- map.connect ':controller/:action/:id'
+ # 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/config/routes.rb.rails2 b/config/routes.rb.rails2
new file mode 100644
index 00000000..ec0ed738
--- /dev/null
+++ b/config/routes.rb.rails2
@@ -0,0 +1,113 @@
+ActionController::Routing::Routes.draw do |map|
+ map.resources :users,
+ :member => {:change_password => :get, :update_password => :post,
+ :change_auth_type => :get, :update_auth_type => :post, :complete => :get,
+ :refresh_token => :post }
+
+ map.with_options :controller => :users do |users|
+ users.signup 'signup', :action => "new"
+ end
+
+ map.resources :contexts, :collection => {:order => :post, :done => :get}, :member => {:done_todos => :get, :all_done_todos => :get} do |contexts|
+ contexts.resources :todos, :name_prefix => "context_"
+ end
+
+ map.resources :projects,
+ :collection => {:order => :post, :alphabetize => :post, :actionize => :post, :done => :get},
+ :member => {:done_todos => :get, :all_done_todos => :get, :set_reviewed => :get} do |projects|
+ projects.resources :todos, :name_prefix => "project_"
+ end
+
+ map.with_options :controller => :projects do |projects|
+ projects.review 'review', :action => :review
+ end
+
+ map.resources :notes
+
+ map.resources :todos,
+ :member => {:toggle_check => :put, :toggle_star => :put, :defer => :put},
+ :collection => {:check_deferred => :post, :filter_to_context => :post, :filter_to_project => :post, :done => :get, :all_done => :get
+ }
+
+ map.with_options :controller => :todos do |todos|
+ todos.home '', :action => "index"
+ todos.tickler 'tickler.:format', :action => "list_deferred"
+ todos.mobile_tickler 'tickler.m', :action => "list_deferred", :format => 'm'
+
+ # This route works for tags with dots like /todos/tag/version1.5
+ # please note that this pattern consumes everything after /todos/tag
+ # so /todos/tag/version1.5.xml will result in :name => 'version1.5.xml'
+ # UPDATE: added support for mobile view. All tags ending on .m will be
+ # routed to mobile view of tags.
+ todos.mobile_tag 'todos/tag/:name.m', :action => "tag", :format => 'm'
+ todos.text_tag 'todos/tag/:name.txt', :action => "tag", :format => 'txt'
+ todos.tag 'todos/tag/:name', :action => "tag", :name => /.*/
+ todos.done_tag 'todos/done/tag/:name', :action => "done_tag"
+ todos.all_done_tag 'todos/all_done/tag/:name', :action => "all_done_tag"
+
+ todos.tags 'tags.autocomplete', :action => "tags", :format => 'autocomplete'
+ todos.auto_complete_for_predecessor 'auto_complete_for_predecessor', :action => 'auto_complete_for_predecessor'
+
+ todos.calendar 'calendar.ics', :action => "calendar", :format => 'ics'
+ todos.calendar 'calendar.xml', :action => "calendar", :format => 'xml'
+ todos.calendar 'calendar', :action => "calendar"
+
+ todos.hidden 'hidden.xml', :action => "list_hidden", :format => 'xml'
+
+ todos.mobile 'mobile', :action => "index", :format => 'm'
+ todos.mobile_abbrev 'm', :action => "index", :format => 'm'
+ todos.mobile_abbrev_new 'm/new', :action => "new", :format => 'm'
+
+ todos.mobile_todo_show_notes 'todos/notes/:id.m', :action => "show_notes", :format => 'm'
+ todos.todo_show_notes 'todos/notes/:id', :action => "show_notes"
+ todos.done_todos 'todos/done', :action => :done
+ todos.all_done_todos 'todos/all_done', :action => :all_done
+ end
+ map.root :controller => 'todos' # Make OpenID happy because it needs #root_url defined
+
+ map.resources :recurring_todos, :collection => {:done => :get},
+ :member => {:toggle_check => :put, :toggle_star => :put}
+ map.with_options :controller => :recurring_todos do |rt|
+ rt.recurring_todos 'recurring_todos', :action => 'index'
+ end
+
+ map.with_options :controller => :login do |login|
+ login.login 'login', :action => 'login'
+ login.login_cas 'login_cas', :action => 'login_cas'
+ login.formatted_login 'login.:format', :action => 'login'
+ login.logout 'logout', :action => 'logout'
+ login.formatted_logout 'logout.:format', :action => 'logout'
+ end
+
+ map.with_options :controller => :feedlist do |fl|
+ fl.mobile_feeds 'feeds.m', :action => 'index', :format => 'm'
+ fl.feeds 'feeds', :action => 'index'
+ end
+
+ map.with_options :controller => :integrations do |i|
+ i.integrations 'integrations', :action => 'index'
+ i.rest_api_docs 'integrations/rest_api', :action => "rest_api"
+ i.search_plugin 'integrations/search_plugin.xml', :action => 'search_plugin', :format => 'xml'
+ i.google_gadget 'integrations/google_gadget.xml', :action => 'google_gadget', :format => 'xml'
+ i.cloudmailin 'integrations/cloudmailin', :action => 'cloudmailin'
+ end
+
+ map.with_options :controller => :preferences do |p|
+ p.preferences 'preferences', :action => 'index'
+ p.preferences_date_format 'preferences/render_date_format', :action => 'render_date_format'
+ end
+
+ map.with_options :controller => :stats do |stats|
+ stats.stats 'stats', :action => 'index'
+ stats.done_overview 'done', :action => 'done'
+ end
+
+ map.search 'search', :controller => 'search', :action => 'index'
+ map.data 'data', :controller => 'data', :action => 'index'
+
+ Translate::Routes.translation_ui(map) if Rails.env != "production"
+
+ # Install the default route as the lowest priority.
+ map.connect ':controller/:action/:id'
+
+end
diff --git a/db/seeds.rb b/db/seeds.rb
new file mode 100644
index 00000000..4edb1e85
--- /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 00000000..fe41f5cc
--- /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 00000000..e69de29b
diff --git a/lib/tasks/.gitkeep b/lib/tasks/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/public/404.html b/public/404.html
index eff660b9..9a48320a 100644
--- a/public/404.html
+++ b/public/404.html
@@ -1,23 +1,19 @@
-
-
-
-
+
+
-
The page you were looking for doesn't exist (404)
-
+
@@ -27,4 +23,4 @@
You may have mistyped the address or the page may have moved.
-
\ No newline at end of file
+
diff --git a/public/422.html b/public/422.html
index b54e4a3c..83660ab1 100644
--- a/public/422.html
+++ b/public/422.html
@@ -1,23 +1,19 @@
-
-
-
-
+
+
-
The change you wanted was rejected (422)
-
+
@@ -27,4 +23,4 @@
Maybe you tried to change something you didn't have access to.
-
\ No newline at end of file
+
diff --git a/public/500.html b/public/500.html
index 4bc0a825..2d13a43d 100644
--- a/public/500.html
+++ b/public/500.html
@@ -1,23 +1,19 @@
-
-
-
-
+
+
-
We're sorry, but something went wrong (500)
-
+
diff --git a/public/index.html b/public/index.html
new file mode 100644
index 00000000..a1d50995
--- /dev/null
+++ b/public/index.html
@@ -0,0 +1,241 @@
+
+
+
+ Ruby on Rails: Welcome aboard
+
+
+
+
+