1
0
mirror of https://github.com/danbee/danbarberphoto synced 2025-03-04 08:49:07 +00:00

Merge ../template into 3.1_upgrade

Conflicts:
	.gitignore
	.rvmrc
	Gemfile
	Gemfile.lock
	README
	Rakefile
	app/assets/javascripts/application.js
	app/assets/stylesheets/application.css
	app/controllers/admin/admin_users_controller.rb
	app/controllers/application_controller.rb
	app/models/admin_user.rb
	config.ru
	config/application.rb
	config/config.yml
	config/database.yml
	config/environment.rb
	config/environments/development.rb
	config/environments/production.rb
	config/environments/test.rb
	config/initializers/secret_token.rb
	config/initializers/session_store.rb
	config/routes.rb
	db/schema.rb
	db/seeds.rb
This commit is contained in:
Dan Barber 2011-10-30 12:15:13 +00:00
commit 08170ec5e0
92 changed files with 1577 additions and 43 deletions

1
.gitignore vendored
View File

@ -8,3 +8,4 @@ public/system
.*.swp .*.swp
.DS* .DS*
**/.DS* **/.DS*
.sass-cache/

48
.rvmrc
View File

@ -4,44 +4,52 @@
# development environment upon cd'ing into the directory # development environment upon cd'ing into the directory
# First we specify our desired <ruby>[@<gemset>], the @gemset name is optional. # First we specify our desired <ruby>[@<gemset>], the @gemset name is optional.
environment_id="ruby-1.9.2-p136@danbarberphoto" environment_id="ruby-1.9.2-p290@danbarberphoto"
#
# Uncomment following line if you want options to be set only for given project.
#
# PROJECT_JRUBY_OPTS=( --1.9 )
# #
# First we attempt to load the desired environment directly from the environment # First we attempt to load the desired environment directly from the environment
# file, this is very fast and efficicent compared to running through the entire # file. This is very fast and efficient compared to running through the entire
# CLI and selector. If you want feedback on which environment was used then # CLI and selector. If you want feedback on which environment was used then
# insert the word 'use' after --create as this triggers verbose mode. # insert the word 'use' after --create as this triggers verbose mode.
# #
if [[ -d "${rvm_path:-$HOME/.rvm}/environments" \ if [[ -d "${rvm_path:-$HOME/.rvm}/environments" \
&& -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]] ; then && -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]]
then
\. "${rvm_path:-$HOME/.rvm}/environments/$environment_id" \. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
if [[ -s "${rvm_path:-$HOME/.rvm}/hooks/after_use" ]]
then
. "${rvm_path:-$HOME/.rvm}/hooks/after_use"
fi
else else
# If the environment file has not yet been created, use the RVM CLI to select. # If the environment file has not yet been created, use the RVM CLI to select.
rvm --create use "$environment_id" if ! rvm --create use "$environment_id"
then
echo "Failed to create RVM environment '${environment_id}'."
exit 1
fi
fi fi
# #
# If you use an RVM gemset file to install a list of gems (*.gems), you can have # If you use an RVM gemset file to install a list of gems (*.gems), you can have
# it be automatically loaded, uncomment the following and adjust the filename if # it be automatically loaded. Uncomment the following and adjust the filename if
# necessary. # necessary.
# #
# filename=".gems" # filename=".gems"
# if [[ -s "$filename" ]] ; then # if [[ -s "$filename" ]]
# then
# rvm gemset import "$filename" | grep -v already | grep -v listed | grep -v complete | sed '/^$/d' # rvm gemset import "$filename" | grep -v already | grep -v listed | grep -v complete | sed '/^$/d'
# fi # fi
# # If you use bundler, this might be useful to you:
# If you use bundler and would like to run bundle each time you enter the # if command -v bundle && [[ -s Gemfile ]]
# directory you can uncomment the following code. # then
# # bundle install
# # Ensure that Bundler is installed, install it if it is not. # fi
# if ! command -v bundle ; then
# printf "The rubygem 'bundler' is not installed, installing it now.\n"
# gem install bundler
# fi
#
# # Bundle while redcing excess noise.
# printf "Bundling your gems this may take a few minutes on a fresh clone.\n"
# bundle | grep -v 'Using' | grep -v 'complete' | sed '/^$/d'
#

View File

@ -35,9 +35,11 @@ gem 'aws-s3', :require => 'aws/s3'
# Bundle gems for the local environment. Make sure to # Bundle gems for the local environment. Make sure to
# put test-only gems in this group so their generators # put test-only gems in this group so their generators
# and rake tasks are available in development mode: # and rake tasks are available in development mode:
# group :development, :test do group :development do
# gem 'webrat' gem 'ruby_parser'
# end gem 'hpricot'
gem 'powder'
end
gem 'sass-rails', "~> 3.1.0" gem 'sass-rails', "~> 3.1.0"
gem "exception_notification", :git => "git://github.com/rails/exception_notification", :require => 'exception_notifier' gem "exception_notification", :git => "git://github.com/rails/exception_notification", :require => 'exception_notifier'

View File

@ -65,6 +65,7 @@ GEM
execjs (1.2.9) execjs (1.2.9)
multi_json (~> 1.0) multi_json (~> 1.0)
hike (1.2.1) hike (1.2.1)
hpricot (0.8.4)
i18n (0.6.0) i18n (0.6.0)
jquery-rails (1.0.16) jquery-rails (1.0.16)
railties (~> 3.0) railties (~> 3.0)
@ -87,6 +88,8 @@ GEM
polyamorous (0.5.0) polyamorous (0.5.0)
activerecord (~> 3.0) activerecord (~> 3.0)
polyglot (0.3.2) polyglot (0.3.2)
powder (0.1.6)
thor (>= 0.11.5)
rack (1.3.5) rack (1.3.5)
rack-cache (1.1) rack-cache (1.1)
rack (>= 0.4) rack (>= 0.4)
@ -115,6 +118,8 @@ GEM
rdiscount (1.6.8) rdiscount (1.6.8)
rdoc (3.11) rdoc (3.11)
json (~> 1.4) json (~> 1.4)
ruby_parser (2.3.1)
sexp_processor (~> 3.0)
sass (3.1.10) sass (3.1.10)
sass-rails (3.1.4) sass-rails (3.1.4)
actionpack (~> 3.1.0) actionpack (~> 3.1.0)
@ -122,6 +127,7 @@ GEM
sass (>= 3.1.4) sass (>= 3.1.4)
sprockets (~> 2.0.0) sprockets (~> 2.0.0)
tilt (~> 1.3.2) tilt (~> 1.3.2)
sexp_processor (3.0.7)
sprockets (2.0.3) sprockets (2.0.3)
hike (~> 1.2) hike (~> 1.2)
rack (~> 1.0) rack (~> 1.0)
@ -158,12 +164,15 @@ DEPENDENCIES
coffee-rails (~> 3.1.0) coffee-rails (~> 3.1.0)
devise devise
exception_notification! exception_notification!
hpricot
jquery-rails jquery-rails
mini_exiftool mini_exiftool
paperclip paperclip
pg pg
powder
rails (= 3.1.1) rails (= 3.1.1)
rdiscount rdiscount
ruby_parser
sass-rails (~> 3.1.0) sass-rails (~> 3.1.0)
sqlite3-ruby sqlite3-ruby
squeel squeel

37
README
View File

@ -91,7 +91,11 @@ mode. With gems, use <tt>sudo gem install ruby-debug</tt>. Example:
class WeblogController < ActionController::Base class WeblogController < ActionController::Base
def index def index
<<<<<<< HEAD
@posts = Post.find(:all) @posts = Post.find(:all)
=======
@posts = Post.all
>>>>>>> cbb3800953736b1e2692d88c642ae066ac86adbc
debugger debugger
end end
end end
@ -139,7 +143,11 @@ To reload your controllers and models after launching the console run
<tt>reload!</tt> <tt>reload!</tt>
More information about irb can be found at: More information about irb can be found at:
<<<<<<< HEAD
link:http://www.rubycentral.com/pickaxe/irb.html link:http://www.rubycentral.com/pickaxe/irb.html
=======
link:http://www.rubycentral.org/pickaxe/irb.html
>>>>>>> cbb3800953736b1e2692d88c642ae066ac86adbc
== dbconsole == dbconsole
@ -156,8 +164,18 @@ PostgreSQL and SQLite 3.
The default directory structure of a generated Ruby on Rails application: The default directory structure of a generated Ruby on Rails application:
|-- app |-- app
<<<<<<< HEAD
| |-- controllers | |-- controllers
| |-- helpers | |-- helpers
=======
| |-- assets
| |-- images
| |-- javascripts
| `-- stylesheets
| |-- controllers
| |-- helpers
| |-- mailers
>>>>>>> cbb3800953736b1e2692d88c642ae066ac86adbc
| |-- models | |-- models
| `-- views | `-- views
| `-- layouts | `-- layouts
@ -171,11 +189,15 @@ The default directory structure of a generated Ruby on Rails application:
| `-- tasks | `-- tasks
|-- log |-- log
|-- public |-- public
<<<<<<< HEAD
| |-- images | |-- images
| |-- javascripts | |-- javascripts
| `-- stylesheets | `-- stylesheets
|-- script |-- script
| `-- performance | `-- performance
=======
|-- script
>>>>>>> cbb3800953736b1e2692d88c642ae066ac86adbc
|-- test |-- test
| |-- fixtures | |-- fixtures
| |-- functional | |-- functional
@ -188,11 +210,22 @@ The default directory structure of a generated Ruby on Rails application:
| |-- sessions | |-- sessions
| `-- sockets | `-- sockets
`-- vendor `-- vendor
<<<<<<< HEAD
=======
|-- assets
`-- stylesheets
>>>>>>> cbb3800953736b1e2692d88c642ae066ac86adbc
`-- plugins `-- plugins
app app
Holds all the code that's specific to this particular application. Holds all the code that's specific to this particular application.
<<<<<<< HEAD
=======
app/assets
Contains subdirectories for images, stylesheets, and JavaScript files.
>>>>>>> cbb3800953736b1e2692d88c642ae066ac86adbc
app/controllers app/controllers
Holds controllers that should be named like weblogs_controller.rb for Holds controllers that should be named like weblogs_controller.rb for
automated URL mapping. All controllers should descend from automated URL mapping. All controllers should descend from
@ -237,8 +270,12 @@ lib
the load path. the load path.
public public
<<<<<<< HEAD
The directory available for the web server. Contains subdirectories for The directory available for the web server. Contains subdirectories for
images, stylesheets, and javascripts. Also contains the dispatchers and the images, stylesheets, and javascripts. Also contains the dispatchers and the
=======
The directory available for the web server. Also contains the dispatchers and the
>>>>>>> cbb3800953736b1e2692d88c642ae066ac86adbc
default HTML files. This should be set as the DOCUMENT_ROOT of your web default HTML files. This should be set as the DOCUMENT_ROOT of your web
server. server.

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -0,0 +1,9 @@
// This is a manifest file that'll be compiled into including all the files listed below.
// Add new JavaScript/Coffee code in separate files in this directory and they'll automatically
// be included in the compiled file accessible from http://example.com/assets/application.js
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// the compiled file.
//
//= require jquery
//= require jquery_ujs
//= require_directory ./admin

View File

@ -0,0 +1,3 @@
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/

View File

@ -0,0 +1,3 @@
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/

View File

@ -0,0 +1,3 @@
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/

View File

@ -0,0 +1,4 @@
$ ->
$(".flash a.close").click ->
$(this).parent().fadeOut(200)
false

View File

@ -0,0 +1,3 @@
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/

View File

@ -0,0 +1,3 @@
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/

View File

@ -0,0 +1,8 @@
/*
* This is a manifest file that'll automatically include all the stylesheets available in this directory
* and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
* the top of the compiled file, but it's generally better to create a new file per style scope.
*= require_self
*= require formtastic
*= require_directory ./admin
*/

View File

@ -0,0 +1,141 @@
// Place all the styles related to the admin/admin controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/
@import "../includes/v_linear_grad"
@import "../includes/round_corners"
@import "../includes/transition"
@import "../includes/box_shadow"
body
background-color: #999
color: #333
font-family: "Helvetica Neue", "Arial", sans-serif
font-size: 14px
line-height: 18px
margin: 0
padding: 0
#page, #login
background: #fafafa
padding: 1em 2em 3em
border-bottom: 1px solid #666
@include box-shadow("0 1px 4px rgba(0, 0, 0, 0.3)")
#login
width: 40em
margin: 5em auto 0
header
background: #333
margin: -2.5em -2em 0
#user
position: absolute
top: 1em
right: 2em
color: #ccc
a
color: #999
h1
background: #333
font-size: 2em
margin-bottom: 0em
a
width: 263px
height: 24px
display: inline-block
padding: 1em 1em
text-indent: -1000em
background: url(/assets/admin/logo.png) 1em 0.75em no-repeat
&:hover
background-color: inherit
#login
h1
margin-bottom: 0.5em
position: relative
z-index: 1
@include box-shadow("0 1px 2px rgba(0, 0, 0, 0.3)")
h2
margin-top: 1.2em
p, ol, ul, td
font-family: "Helvetica Neue", "Arial", sans-serif
font-size: 1em
line-height: 1.5em
pre
background-color: #eee
padding: 0.5em
font-size: 0.9em
a
color: #000
&:hover
color: #fff
background-color: #000
div
&.field, &.actions
margin-bottom: 0.5em
#notice
color: green
.field_with_errors
padding: 0.3em
background-color: red
display: table
table
border: 1px solid #bbb
border-spacing: 0
@include box-shadow("0 2px 2px rgba(0, 0, 0, 0.2)")
@include round-corners(5px)
td, th
border-bottom: 1px solid #bbb
tr:nth-child(even) td
background: #f0f0f0
tr:nth-child(odd) td
background: #fff
thead
background: #ddd
color: #333
td, th
text-align: left
padding: 0.5em 0.7em
tfoot td
background: #ddd !important
border-bottom: 0
#error_explanation
width: 450px
border: 2px solid red
padding: 7px
padding-bottom: 0
margin-bottom: 20px
background-color: #f0f0f0
h2
text-align: left
font-weight: bold
padding: 5px 5px 5px 15px
font-size: 12px
margin: -7px
margin-bottom: 0px
background-color: #c00
color: #fff
ul li
font-size: 12px
list-style: square
form ul.taxonomies
border: 1px solid #ccc
@include round-corners(3px)
@include box-shadow("inset 2px 2px 4px rgba(0, 0, 0, 0.1)")
margin-top: 1em
padding: 1em
width: 25%
float: right
> li
font-weight: bold

View File

@ -0,0 +1,3 @@
// Place all the styles related to the admin/dashboard controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/

View File

@ -0,0 +1,3 @@
// Place all the styles related to the admin/downloads controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/

View File

@ -0,0 +1,40 @@
@import "../includes/round_corners"
@import "../includes/box_shadow"
.alert, .notice
position: relative
font-size: 1em
border-style: solid
border-width: 0 0 1px
padding: 0.7em 2em
margin: -1em -2em 0
a.close
font-size: 1em
position: absolute
font-weight: bold
right: 0em
top: 0em
text-decoration: none
padding: 0.7em 1em
color: #666
.alert
border-color: #cc6633
background: #ffddcc
color: #662200
a.close
color: #662200
&:hover, &:focus
background-color: #cc6633
color: #ffddcc
.notice
border-color: #449911
background: #ddffcc
color: #226600
a.close
color: #226600
&:hover, &:focus
background-color: #449911
color: #ddffcc

View File

@ -0,0 +1,103 @@
@import "../includes/v_linear_grad"
@import "../includes/round_corners"
@import "../includes/transition"
@import "../includes/box_shadow"
@import "../includes/button"
form.formtastic
background: white
border: 1px solid #ccc
margin: 0 0 1em
padding: 0 1em
@include box-shadow("0 2px 2px rgba(0, 0, 0, 0.05)")
label
text-align: right
margin-right: 1em
.required
label
font-weight: bold
@include round-corners(5px)
ol, ul
margin-bottom: 0.5em
.input
margin-bottom: 0em
margin-top: 0em
overflow: hidden
padding: 0.5em 0
.label
width: 13em
textarea
height: 10em
input, textarea
font-family: "Helvetica Neue", "Arial", sans-serif
font-size: 1em
margin-right: 5px
border-width: 1px
border-style: solid
border-color: #999 #DDD #DDD #999
padding: 0.3em
@include round-corners(2px)
@include box-shadow("inset 1px 1px 4px rgba(0, 0, 0, 0.1)")
&:focus
border-color: #67A #9AF #9AF #67A
@include box-shadow("0 0 4px rgba(0, 128, 255, 0.5), inset 1px 1px 4px rgba(0, 0, 0, 0.1)")
&[type=text], &[type=email]
width: 15em
&[type=number]
width: 3.5em
text-align: right
&:-webkit-inner-spin-button, &:-webkit-outer-spin-button
-webkit-appearance: none
margin: 0
input[type=submit], a.button
@include button
&[name=commit]
background-color: #9C7
border-color: #370
color: white
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.5)
@include box-shadow("0 1px 0 rgba(0, 0, 0, 0.25), inset -1px -1px 0 rgba(255, 255, 255, 0.2), inset 1px 1px 0 rgba(255, 255, 255, 0.3), inset 0 0 6px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.3)")
&:hover, &:focus
background-color: #8B6
.error input
border-width: 1px
border-style: solid
border-color: #933 #FBB #FBB #933
background: #FFEFEF
padding: 0.3em
box-shadow: inset 1px 1px 4px rgba(0, 0, 0, 0.1)
.inline-errors
display: inline
margin-left: 1em
color: #933
fieldset.inputs
padding: 1em 0
border-bottom: 1px solid #ccc
fieldset.buttons
padding: 1.5em 0 1em
.stringish, .text
input, textarea
width: 40%
.help
margin-left: 14em
margin-top: -0.5em
p
font-size: 0.8em
color: #999
a.button
@include button
a.button.new
background-color: #7AC
border-color: #047
color: white
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.5)
@include box-shadow("0 1px 0 rgba(0, 0, 0, 0.25), inset -1px -1px 0 rgba(255, 255, 255, 0.2), inset 1px 1px 0 rgba(255, 255, 255, 0.3), inset 0 0 6px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.3)")
&:hover, &:focus
background-color: #69B

View File

@ -0,0 +1,50 @@
@import "../includes/v_linear_grad"
@import "../includes/round_corners"
@import "../includes/transition"
@import "../includes/box_shadow"
header
nav
ul
font-size: 1em
@include v-linear-grad(rgba(0,0,0,0), rgba(0,0,0,0.2))
@include box-shadow("0 1px 2px rgba(0, 0, 0, 0.3), inset 0 -1px 0 rgba(255, 255, 255, 0.5)")
background-color: #DDD
border-style: solid
border-width: 0 0 1px 0
border-color: #999
color: white
margin: 0 0 1em
padding: 0 1em
list-style: none
height: 35px
position: relative
z-index: 100
li a
@include v-linear-grad(rgba(0,0,0,0), rgba(0,0,0,0.2))
@include box-shadow("0 1px 0 rgba(0, 0, 0, 0.1), inset 0 -1px 0 rgba(255, 255, 255, 0.5)")
background-color: #DDD
color: #444
text-decoration: none
display: block
height: 21px
float: left
padding: 7px 1em 7px
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5)
@include transition(all 0.15s 0s ease)
&:hover, &:focus
@include v-linear-grad(rgba(0,0,0,0), rgba(0,0,0,0.2))
@include box-shadow("0 1px 0 rgba(0, 0, 0, 0.1), inset 0 -1px 0 rgba(255, 255, 255, 0.5)")
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5)
color: #444
background-color: white
&:active
background-color: #ccc
&.selected
@include v-linear-grad(rgba(0,0,0,0.4), rgba(0,0,0,0))
@include box-shadow("0 1px 0 rgba(0, 0, 0, 0.1), inset 0 -1px 0 rgba(255, 255, 255, 0.2), inset 0 0 6px rgba(0, 0, 0, 0.4)")
text-shadow: 0 1px 0 rgba(0, 0, 0, 0.5)
background-color: #999
color: white
&:hover
background-color: #aaa

View File

@ -0,0 +1,3 @@
// Place all the styles related to the admin/unlocks controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/

View File

@ -0,0 +1,3 @@
// Place all the styles related to the home controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/

View File

@ -0,0 +1,3 @@
// Place all the styles related to the home controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/

View File

@ -0,0 +1,24 @@
@mixin button
display: inline-block
position: relative
font-family: "Helvetica Neue", "Arial", sans-serif
font-size: 1em
text-decoration: none
padding: 0.3em 1em
@include v-linear-grad(rgba(0,0,0,0), rgba(0,0,0,0.2))
@include box-shadow("0 1px 0 rgba(0, 0, 0, 0.25), inset -1px -1px 0 rgba(255, 255, 255, 0.5), inset 1px 1px 0 rgba(255, 255, 255, 0.6), inset 0 0 6px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.3)")
border-width: 1px
border-style: solid
border-color: #888
background-color: white
color: #555
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5)
font-weight: bold
cursor: pointer
@include transition(all 0.15s 0s ease)
@include round-corners(3px)
&:hover, &:focus
background-color: #eee
color: #555
&:active
top: 1px

View File

@ -0,0 +1,5 @@
@mixin round-corners($radius)
border-radius: $radius
-moz-border-radius: $radius
-webkit-border-radius: $radius
-o-border-radius: $radius

View File

@ -0,0 +1,5 @@
@mixin transition($value)
-moz-transition: $value
-webkit-transition: $value
-o-transition: $value
transition: $value

View File

@ -0,0 +1,7 @@
@mixin v-linear-grad($from, $to)
background-image: -moz-linear-gradient(top, $from 0%, $to 100%)
background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, $from), color-stop(100%, $to))
background-image: -webkit-linear-gradient(top, $from 0%, $to 100%)
background-image: -o-linear-gradient(top, $from 0%, $to 100%)
background-image: -ms-linear-gradient(top, $from 0%, $to 100%)
background-image: linear-gradient(top, $from 0%, $to 100%)

View File

@ -0,0 +1,10 @@
class Admin::AdminController < ApplicationController
layout 'admin/layouts/admin'
before_filter :authenticate_admin_user!
before_filter :admin_menu
def admin_menu
@admin_menu = { :dashboard => '',
:admin_users => '' }
end
end

View File

@ -1,2 +1,69 @@
class Admin::AdminUsersController < Admin::ResourcesController class Admin::AdminUsersController < Admin::AdminController
def index
@admin_users = AdminUser.all
end
def new
@admin_user = AdminUser.new
end
def edit
@admin_user = AdminUser.find(params[:id])
end
def update
@admin_user = AdminUser.find(params[:id])
respond_to do |format|
if @admin_user.update_attributes(params[:admin_user])
format.html { redirect_to(admin_admin_users_path, :notice => 'Admin User was successfully updated.') }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @admin_user.errors, :status => :unprocessable_entity }
end
end
end
def create
@admin_user = AdminUser.new(params[:admin_user])
respond_to do |format|
if @admin_user.save
format.html { redirect_to(admin_admin_users_path, :notice => 'Admin User was successfully added.') }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @admin_user.errors, :status => :unprocessable_entity }
end
end
end
def destroy
@admin_user = AdminUser.find(params[:id])
@admin_user.destroy
respond_to do |format|
format.html { redirect_to(admin_admin_users_path, :notice => 'Admin User was deleted.') }
format.xml { head :ok }
end
end
# Allow the current logged in user to change their password
def edit_password
@admin_user = current_admin_user
end
def update_password
@admin_user = current_admin_user
if @admin_user.update_with_password(params[:admin_user])
sign_in(@admin_user, :bypass => true)
redirect_to admin_dashboard_path, :notice => "Password updated!"
else
render :edit_password
end
end
end end

View File

@ -0,0 +1,60 @@
class Admin::ConfirmationsController < ::Devise::PasswordsController
layout "admin/layouts/login"
skip_before_filter(:authenticate_user!)
# PUT /resource/confirmation
def update
with_unconfirmed_confirmable do
if @confirmable.has_no_password?
@confirmable.attempt_set_password(params[:admin_user])
if @confirmable.valid?
do_confirm
else
do_show
@confirmable.errors.clear #so that we wont render :new
end
else
self.class.add_error_on(self, :email, :password_allready_set)
end
end
if !@confirmable.errors.empty?
render_with_scope :new
end
end
# GET /resource/confirmation?confirmation_token=abcdef
def show
with_unconfirmed_confirmable do
if @confirmable.has_no_password?
do_show
else
do_confirm
end
end
if !@confirmable.errors.empty?
render_with_scope :new
end
end
protected
def with_unconfirmed_confirmable
@confirmable = AdminUser.find_or_initialize_with_error_by(:confirmation_token, params[:confirmation_token])
if !@confirmable.new_record?
@confirmable.only_if_unconfirmed {yield}
end
end
def do_show
@confirmation_token = params[:confirmation_token]
@requires_password = true
self.resource = @confirmable
render_with_scope :show
end
def do_confirm
@confirmable.confirm!
set_flash_message :notice, :confirmed
sign_in_and_redirect(resource_name, @confirmable)
end
end

View File

@ -0,0 +1,2 @@
class Admin::DashboardController < Admin::AdminController
end

View File

@ -0,0 +1,3 @@
class Admin::PasswordsController < ::Devise::PasswordsController
layout "admin/layouts/login"
end

View File

@ -0,0 +1,3 @@
class Admin::RegistrationsController < ::Devise::RegistrationsController
layout "admin/layouts/login"
end

View File

@ -0,0 +1,3 @@
class Admin::SessionsController < ::Devise::SessionsController
layout "admin/layouts/login"
end

View File

@ -0,0 +1,3 @@
class Admin::UnlocksController < ::Devise::UnlocksController
layout "admin/layouts/login"
end

View File

@ -1,3 +1,12 @@
class ApplicationController < ActionController::Base class ApplicationController < ActionController::Base
protect_from_forgery protect_from_forgery
def after_sign_in_path_for(resource_or_scope)
admin_dashboard_path
end
def after_sign_out_path_for(resource_or_scope)
new_admin_user_session_path
end
end end

View File

@ -0,0 +1,4 @@
class HomeController < ApplicationController
def index
end
end

View File

@ -0,0 +1,2 @@
module Admin::AdminHelper
end

View File

@ -0,0 +1,2 @@
module Admin::DashboardHelper
end

View File

@ -0,0 +1,2 @@
module Admin::DownloadsHelper
end

View File

@ -0,0 +1,2 @@
module Admin::UnlocksHelper
end

View File

@ -0,0 +1,2 @@
module HomeHelper
end

View File

@ -1,8 +1,36 @@
class AdminUser < ActiveRecord::Base class AdminUser < ActiveRecord::Base
# Include default devise modules. Others available are:
# :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :confirmable,
:recoverable, :rememberable, :trackable, :validatable, :lockable
ROLE = Typus::Configuration.roles.keys.sort # Setup accessible (or protected) attributes for your model
LANGUAGE = Typus.locales attr_accessible :email, :password, :password_confirmation, :remember_me
# new function to set the password without knowing the current password used in our confirmation controller.
def attempt_set_password(params)
p = {}
p[:password] = params[:password]
p[:password_confirmation] = params[:password_confirmation]
update_attributes(p)
end
# new function to return whether a password has been set
def has_no_password?
self.encrypted_password.blank?
end
enable_as_typus_user # new function to provide access to protected method unless_confirmed
def only_if_unconfirmed
unless_confirmed {yield}
end
def password_required?
# Password is required if it is being set, but not for new records
if !persisted?
false
else
!password.nil? || !password_confirmation.nil?
end
end
end end

View File

@ -0,0 +1,7 @@
%tr
%td= admin_user.email
%td= admin_user.last_sign_in_at
%td= admin_user.last_sign_in_ip
%td{ :class => :actions }
- unless admin_user == current_admin_user
= link_to "Delete", admin_admin_user_path(admin_user), :method => :delete, :confirm => "Are you sure you wish to delete this Admin User?"

View File

@ -0,0 +1,3 @@
= semantic_form_for [:admin, admin_user] do |f|
= f.inputs :email
= f.buttons

View File

@ -0,0 +1,2 @@
%h2 Edit Admin User
= render :partial => "form", :locals => { :admin_user => @admin_user }

View File

@ -0,0 +1,11 @@
%h3 Change your password
= semantic_form_for(@admin_user, :url => update_password_admin_admin_user_path, :html => { :method => :put }) do |f|
= f.inputs do
= f.input :current_password
= f.inputs do
= f.input :password, :label => "New Password"
= f.input :password_confirmation, :label => "Confirm Password"
= f.buttons do
= f.submit "Change my password"

View File

@ -0,0 +1,16 @@
%h2 Admin Users
%table
%thead
%tr
%th Email
%th Last Signed In?
%th IP Address
%th
%tbody
= render :partial => "admin_user", :collection => @admin_users
%tfoot
%tr
%td{:colspan => 4}
%br/
= link_to 'New Admin User', new_admin_admin_user_path, :class => [:button, :new]

View File

@ -0,0 +1,2 @@
%h2 New Admin User
= render :partial => "form", :locals => { :admin_user => @admin_user }

View File

@ -0,0 +1,11 @@
%h3 Resend confirmation instructions
= semantic_form_for(resource, :as => resource_name, :url => confirmation_path(resource_name), :html => { :method => :post }) do |f|
= f.inputs do
= f.input :email
= f.buttons do
= f.submit "Resend confirmation instructions"
= render :partial => "devise/shared/links"

View File

@ -0,0 +1,12 @@
%h3= "Account Activation for #{resource.email}"
= semantic_form_for resource, :as => resource_name, :url => update_user_confirmation_path, :html => {:method => 'put'}, :id => 'activation-form' do |f|
= devise_error_messages!
= field_set_tag "", :class => "inputs" do
%ol
- if @requires_password
= f.input :password, :label => 'Choose a Password'
= f.input :password_confirmation, :label => 'Confirm Password'
= hidden_field_tag :confirmation_token,@confirmation_token
= f.buttons do
= f.submit "Activate"

View File

@ -0,0 +1 @@
%p This is the admin dashboard.

View File

@ -0,0 +1,14 @@
!!!
%html
%head
%title= "#{APP_CONFIG['name']} Admin"
= stylesheet_link_tag "admin"
= javascript_include_tag "admin"
= csrf_meta_tag
%body
#page
%header{ :role => "banner" }= render :partial => "admin/shared/header"
= render :partial => "shared/flash_messages"
= yield
%footer{ :role => "footer" }= render :partial => "admin/shared/footer"

View File

@ -0,0 +1,13 @@
!!!
%html
%head
%title= "#{APP_CONFIG['name']} Admin"
= stylesheet_link_tag "admin"
= javascript_include_tag "admin"
= csrf_meta_tag
%body
#login
%header{ :role => "banner" }= render :partial => "admin/shared/login_header"
= render :partial => "shared/flash_messages"
= yield

View File

@ -0,0 +1,14 @@
%h3 Change your password
= semantic_form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :put }) do |f|
= devise_error_messages!
= f.hidden_field :reset_password_token
= f.inputs do
= f.input :password, :label => "New Password"
= f.input :password_confirmation, :label => "Confirm Password"
= f.buttons do
= f.submit "Change my password"
= render :partial => "devise/shared/links"

View File

@ -0,0 +1,11 @@
%h3 Forgot your password?
= semantic_form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :post }) do |f|
= f.inputs do
= f.input :email
= f.buttons do
= f.submit "Reset Password"
= render :partial => "devise/shared/links"

View File

@ -0,0 +1,14 @@
%h3 Sign in
= semantic_form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f|
= f.inputs do
= f.input :email
= f.input :password
- if devise_mapping.rememberable?
= f.input :remember_me, :as => :boolean
= f.buttons do
= f.submit "Sign In"
= render :partial => "devise/shared/links"

View File

View File

@ -0,0 +1,3 @@
%h1= link_to "Abiquo Downloads", admin_dashboard_path
= render :partial => "admin/shared/user"
= render :partial => "admin/shared/menu"

View File

@ -0,0 +1 @@
%h1= link_to "Abiquo Downloads", admin_dashboard_path

View File

@ -0,0 +1,4 @@
%nav
%ul
- @admin_menu.each do |key, value|
= render :partial => "admin/shared/menu_item", :locals => { :menu_item => key }

View File

@ -0,0 +1 @@
%li= link_to menu_item.to_s.gsub(/_/, ' ').titleize, { :controller => menu_item }, :class => (params[:controller] == "admin/" + menu_item.to_s ? "selected" : nil)

View File

@ -0,0 +1,6 @@
#user
%strong= current_admin_user.email
|
= link_to "Change Password", edit_password_admin_admin_user_path
|
= link_to "Logout", destroy_admin_user_session_path, :method => :delete

View File

@ -0,0 +1,11 @@
%h3 Resend unlock instructions
= semantic_form_for(resource, :as => resource_name, :url => unlock_path(resource_name), :html => { :method => :post }) do |f|
= f.inputs do
= f.input :email
= f.buttons do
= f.submit "Resend unlock instructions"
= render :partial => "devise/shared/links"

View File

@ -0,0 +1 @@
%h1= APP_CONFIG['name']

View File

@ -0,0 +1,9 @@
!!!
%html
%head
%title= APP_CONFIG['name']
= stylesheet_link_tag "application"
= javascript_include_tag "application"
= csrf_meta_tags
%body
= yield

View File

@ -0,0 +1,2 @@
%header{:role => :banner}
%h1 Abiquo Downloads

View File

@ -0,0 +1,10 @@
- if !flash[:notice].blank?
%p.flash.notice
= flash[:notice]
= link_to raw("&times;"), "#", :class => :close
- if !flash[:alert].blank?
%p.flash.alert
= flash[:alert]
= link_to raw("&times;"), "#", :class => :close

View File

@ -1,4 +1,4 @@
name: Dan Barber Photo name: Dan Barber Photo
page_title: Dan Barber Photography page_title: Dan Barber Photography
meta_description: "" meta_description: ""
meta_keywords: "" meta_keywords: ""

View File

@ -41,4 +41,4 @@ DanBarberPhoto::Application.configure do
config.action_mailer.default_url_options = { :host => "danbarberphoto.dev" } config.action_mailer.default_url_options = { :host => "danbarberphoto.dev" }
end end

View File

@ -58,7 +58,7 @@ DanBarberPhoto::Application.configure do
# Send deprecation notices to registered listeners # Send deprecation notices to registered listeners
config.active_support.deprecation = :notify config.active_support.deprecation = :notify
# Heroku Sendgrid settings. # Settings for Sendgrid Free on Heroku
ActionMailer::Base.smtp_settings = { ActionMailer::Base.smtp_settings = {
:address => 'smtp.sendgrid.net', :address => 'smtp.sendgrid.net',
:port => '587', :port => '587',

View File

@ -7,7 +7,11 @@ DanBarberPhoto::Application.configure do
# and recreated between test runs. Don't rely on the data there! # and recreated between test runs. Don't rely on the data there!
config.cache_classes = true config.cache_classes = true
# Log error messages when you accidentally call methods on nil. # Configure static asset server for tests with Cache-Control for performance
config.serve_static_assets = true
config.static_cache_control = "public, max-age=3600"
# Log error messages when you accidentally call methods on nil
config.whiny_nils = true config.whiny_nils = true
# Show full error reports and disable caching # Show full error reports and disable caching
@ -32,4 +36,7 @@ DanBarberPhoto::Application.configure do
# Print deprecation notices to the stderr # Print deprecation notices to the stderr
config.active_support.deprecation = :stderr config.active_support.deprecation = :stderr
# Allow pass debug_assets=true as a query parameter to load pages with unpackaged assets
config.assets.allow_debugging = true
end end

View File

@ -0,0 +1,210 @@
# Use this hook to configure devise mailer, warden hooks and so forth. The first
# four configuration values can also be set straight in your models.
Devise.setup do |config|
# ==> Mailer Configuration
# Configure the e-mail address which will be shown in Devise::Mailer,
# note that it will be overwritten if you use your own mailer class with default "from" parameter.
config.mailer_sender = "please-change-me-at-config-initializers-devise@example.com"
# Configure the class responsible to send e-mails.
# config.mailer = "Devise::Mailer"
# ==> ORM configuration
# Load and configure the ORM. Supports :active_record (default) and
# :mongoid (bson_ext recommended) by default. Other ORMs may be
# available as additional gems.
require 'devise/orm/active_record'
# ==> Configuration for any authentication mechanism
# Configure which keys are used when authenticating a user. The default is
# just :email. You can configure it to use [:username, :subdomain], so for
# authenticating a user, both parameters are required. Remember that those
# parameters are used only when authenticating and not when retrieving from
# session. If you need permissions, you should implement that in a before filter.
# You can also supply a hash where the value is a boolean determining whether
# or not authentication should be aborted when the value is not present.
# config.authentication_keys = [ :email ]
# Configure parameters from the request object used for authentication. Each entry
# given should be a request method and it will automatically be passed to the
# find_for_authentication method and considered in your model lookup. For instance,
# if you set :request_keys to [:subdomain], :subdomain will be used on authentication.
# The same considerations mentioned for authentication_keys also apply to request_keys.
# config.request_keys = []
# Configure which authentication keys should be case-insensitive.
# These keys will be downcased upon creating or modifying a user and when used
# to authenticate or find a user. Default is :email.
config.case_insensitive_keys = [ :email ]
# Configure which authentication keys should have whitespace stripped.
# These keys will have whitespace before and after removed upon creating or
# modifying a user and when used to authenticate or find a user. Default is :email.
config.strip_whitespace_keys = [ :email ]
# Tell if authentication through request.params is enabled. True by default.
# config.params_authenticatable = true
# Tell if authentication through HTTP Basic Auth is enabled. False by default.
# config.http_authenticatable = false
# If http headers should be returned for AJAX requests. True by default.
# config.http_authenticatable_on_xhr = true
# The realm used in Http Basic Authentication. "Application" by default.
# config.http_authentication_realm = "Application"
# It will change confirmation, password recovery and other workflows
# to behave the same regardless if the e-mail provided was right or wrong.
# Does not affect registerable.
# config.paranoid = true
# ==> Configuration for :database_authenticatable
# For bcrypt, this is the cost for hashing the password and defaults to 10. If
# using other encryptors, it sets how many times you want the password re-encrypted.
#
# Limiting the stretches to just one in testing will increase the performance of
# your test suite dramatically. However, it is STRONGLY RECOMMENDED to not use
# a value less than 10 in other environments.
config.stretches = Rails.env.test? ? 1 : 10
# Setup a pepper to generate the encrypted password.
# config.pepper = "09f42a4393b21d179831660ef0102527e36691cfe7d0d72f2b23c0b712275223dbca9eced7e781dcb6cbb14f129aed2086c91ab8bb38c519321a61fb1a93c170"
# ==> Configuration for :confirmable
# A period that the user is allowed to access the website even without
# confirming his account. For instance, if set to 2.days, the user will be
# able to access the website for two days without confirming his account,
# access will be blocked just in the third day. Default is 0.days, meaning
# the user cannot access the website without confirming his account.
# config.confirm_within = 2.days
# Defines which key will be used when confirming an account
# config.confirmation_keys = [ :email ]
# ==> Configuration for :rememberable
# The time the user will be remembered without asking for credentials again.
# config.remember_for = 2.weeks
# If true, a valid remember token can be re-used between multiple browsers.
# config.remember_across_browsers = true
# If true, extends the user's remember period when remembered via cookie.
# config.extend_remember_period = false
# If true, uses the password salt as remember token. This should be turned
# to false if you are not using database authenticatable.
config.use_salt_as_remember_token = true
# Options to be passed to the created cookie. For instance, you can set
# :secure => true in order to force SSL only cookies.
# config.cookie_options = {}
# ==> Configuration for :validatable
# Range for password length. Default is 6..128.
# config.password_length = 6..128
# Email regex used to validate email formats. It simply asserts that
# an one (and only one) @ exists in the given string. This is mainly
# to give user feedback and not to assert the e-mail validity.
# config.email_regexp = /\A[^@]+@[^@]+\z/
# ==> Configuration for :timeoutable
# The time you want to timeout the user session without activity. After this
# time the user will be asked for credentials again. Default is 30 minutes.
# config.timeout_in = 30.minutes
# ==> Configuration for :lockable
# Defines which strategy will be used to lock an account.
# :failed_attempts = Locks an account after a number of failed attempts to sign in.
# :none = No lock strategy. You should handle locking by yourself.
config.lock_strategy = :failed_attempts
# Defines which key will be used when locking and unlocking an account
# config.unlock_keys = [ :email ]
# Defines which strategy will be used to unlock an account.
# :email = Sends an unlock link to the user email
# :time = Re-enables login after a certain amount of time (see :unlock_in below)
# :both = Enables both strategies
# :none = No unlock strategy. You should handle unlocking by yourself.
# config.unlock_strategy = :both
# Number of authentication tries before locking an account if lock_strategy
# is failed attempts.
config.maximum_attempts = 5
# Time interval to unlock the account if :time is enabled as unlock_strategy.
# config.unlock_in = 1.hour
# ==> Configuration for :recoverable
#
# Defines which key will be used when recovering the password for an account
# config.reset_password_keys = [ :email ]
# Time interval you can reset your password with a reset password key.
# Don't put a too small interval or your users won't have the time to
# change their passwords.
config.reset_password_within = 2.hours
# ==> Configuration for :encryptable
# Allow you to use another encryption algorithm besides bcrypt (default). You can use
# :sha1, :sha512 or encryptors from others authentication tools as :clearance_sha1,
# :authlogic_sha512 (then you should set stretches above to 20 for default behavior)
# and :restful_authentication_sha1 (then you should set stretches to 10, and copy
# REST_AUTH_SITE_KEY to pepper)
# config.encryptor = :sha512
# ==> Configuration for :token_authenticatable
# Defines name of the authentication token params key
# config.token_authentication_key = :auth_token
# If true, authentication through token does not store user in session and needs
# to be supplied on each request. Useful if you are using the token as API token.
# config.stateless_token = false
# ==> Scopes configuration
# Turn scoped views on. Before rendering "sessions/new", it will first check for
# "users/sessions/new". It's turned off by default because it's slower if you
# are using only default views.
# config.scoped_views = false
# Configure the default scope given to Warden. By default it's the first
# devise role declared in your routes (usually :user).
# config.default_scope = :user
# Configure sign_out behavior.
# Sign_out action can be scoped (i.e. /users/sign_out affects only :user scope).
# The default is true, which means any logout action will sign out all active scopes.
# config.sign_out_all_scopes = true
# ==> Navigation configuration
# Lists the formats that should be treated as navigational. Formats like
# :html, should redirect to the sign in page when the user does not have
# access, but formats like :xml or :json, should return 401.
#
# If you have any extra navigational formats, like :iphone or :mobile, you
# should add them to the navigational formats lists.
#
# The :"*/*" and "*/*" formats below is required to match Internet
# Explorer requests.
# config.navigational_formats = [:"*/*", "*/*", :html]
# The default HTTP method used to sign out a resource. Default is :delete.
config.sign_out_via = :delete
# ==> OmniAuth
# Add a new OmniAuth provider. Check the wiki for more information on setting
# up on your models and hooks.
# config.omniauth :github, 'APP_ID', 'APP_SECRET', :scope => 'user,public_repo'
# ==> Warden configuration
# If you want to use other strategies, that are not supported by Devise, or
# change the failure app, you can configure them inside the config.warden block.
#
# config.warden do |manager|
# manager.failure_app = AnotherApp
# manager.intercept_401 = false
# manager.default_strategies(:scope => :user).unshift :some_external_strategy
# end
end

View File

@ -0,0 +1,58 @@
# Additional translations at http://github.com/plataformatec/devise/wiki/I18n
en:
errors:
messages:
expired: "has expired, please request a new one"
not_found: "not found"
already_confirmed: "was already confirmed, please try signing in"
not_locked: "was not locked"
not_saved:
one: "1 error prohibited this %{resource} from being saved:"
other: "%{count} errors prohibited this %{resource} from being saved:"
devise:
failure:
already_authenticated: 'You are already signed in.'
unauthenticated: 'You need to sign in or sign up before continuing.'
unconfirmed: 'You have to confirm your account before continuing.'
locked: 'Your account is locked.'
invalid: 'Invalid email or password.'
invalid_token: 'Invalid authentication token.'
timeout: 'Your session expired, please sign in again to continue.'
inactive: 'Your account was not activated yet.'
sessions:
signed_in: 'Signed in successfully.'
signed_out: 'Signed out successfully.'
passwords:
send_instructions: 'You will receive an email with instructions about how to reset your password in a few minutes.'
updated: 'Your password was changed successfully. You are now signed in.'
updated_not_active: 'Your password was changed successfully.'
send_paranoid_instructions: "If your e-mail exists on our database, you will receive a password recovery link on your e-mail"
confirmations:
send_instructions: 'You will receive an email with instructions about how to confirm your account in a few minutes.'
send_paranoid_instructions: 'If your e-mail exists on our database, you will receive an email with instructions about how to confirm your account in a few minutes.'
confirmed: 'Your account was successfully confirmed. You are now signed in.'
registrations:
signed_up: 'Welcome! You have signed up successfully.'
inactive_signed_up: 'You have signed up successfully. However, we could not sign you in because your account is %{reason}.'
updated: 'You updated your account successfully.'
destroyed: 'Bye! Your account was successfully cancelled. We hope to see you again soon.'
reasons:
inactive: 'inactive'
unconfirmed: 'unconfirmed'
locked: 'locked'
unlocks:
send_instructions: 'You will receive an email with instructions about how to unlock your account in a few minutes.'
unlocked: 'Your account was successfully unlocked. You are now signed in.'
send_paranoid_instructions: 'If your account exists, you will receive an email with instructions about how to unlock it in a few minutes.'
omniauth_callbacks:
success: 'Successfully authorized from %{kind} account.'
failure: 'Could not authorize you from %{kind} because "%{reason}".'
mailer:
confirmation_instructions:
subject: 'Confirmation instructions'
reset_password_instructions:
subject: 'Reset password instructions'
unlock_instructions:
subject: 'Unlock Instructions'

View File

@ -1,6 +1,29 @@
DanBarberPhoto::Application.routes.draw do DanBarberPhoto::Application.routes.draw do
resources :contacts resources :contacts
as :admin_user do
match '/admin_users/confirmation' => 'admin/confirmations#update', :via => :put, :as => :update_user_confirmation
end
devise_for :admin_users, :controllers => {
:sessions => "admin/sessions",
:passwords => "admin/passwords",
#:registrations => "admin/registrations",
:confirmations => "admin/confirmations",
:unlocks => "admin/unlocks"
}
namespace :admin do
root :to => "dashboard#index", :as => :dashboard
resources :admin_users
resource :admin_user do
member do
get :edit_password
put :update_password
end
end
end
# The priority is based upon order of creation: # The priority is based upon order of creation:
# first created -> highest priority. # first created -> highest priority.
@ -67,8 +90,6 @@ DanBarberPhoto::Application.routes.draw do
end end
end end
root :to => 'pages#index'
match 'about' => 'pages#about', :as => :about match 'about' => 'pages#about', :as => :about
#match 'contact' => 'pages#contact', :as => :contact #match 'contact' => 'pages#contact', :as => :contact
resources :contacts, :only => [:new, :create] resources :contacts, :only => [:new, :create]
@ -77,4 +98,12 @@ DanBarberPhoto::Application.routes.draw do
# Note: This route will make all actions in every controller accessible via GET requests. # Note: This route will make all actions in every controller accessible via GET requests.
# match ':controller(/:action(/:id(.:format)))' # match ':controller(/:action(/:id(.:format)))'
# root :to => 'welcome#index'
root :to => 'pages#index'
# See how all your routes lay out with "rake routes"
# This is a legacy wild controller route that's not recommended for RESTful applications.
# Note: This route will make all actions in every controller accessible via GET requests.
# match ':controller(/:action(/:id(.:format)))'
end end

View File

@ -0,0 +1,28 @@
class DeviseCreateAdminUsers < ActiveRecord::Migration
def self.up
create_table(:admin_users) do |t|
t.database_authenticatable :null => false
t.recoverable
t.rememberable
t.trackable
# t.encryptable
t.confirmable
t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both
# t.token_authenticatable
t.timestamps
end
add_index :admin_users, :email, :unique => true
add_index :admin_users, :reset_password_token, :unique => true
add_index :admin_users, :confirmation_token, :unique => true
add_index :admin_users, :unlock_token, :unique => true
# add_index :admin_users, :authentication_token, :unique => true
end
def self.down
drop_table :admin_users
end
end

View File

@ -0,0 +1,16 @@
class AddSessionsTable < ActiveRecord::Migration
def up
create_table :sessions do |t|
t.string :session_id, :null => false
t.text :data
t.timestamps
end
add_index :sessions, :session_id
add_index :sessions, :updated_at
end
def down
drop_table :sessions
end
end

View File

@ -1,3 +1,4 @@
# encoding: UTF-8
# This file is auto-generated from the current state of the database. Instead # This file is auto-generated from the current state of the database. Instead
# of editing this file, please use the migrations feature of Active Record to # of editing this file, please use the migrations feature of Active Record to
# incrementally modify your database, and then regenerate this schema definition. # incrementally modify your database, and then regenerate this schema definition.
@ -10,18 +11,25 @@
# #
# It's strongly recommended to check this file into your version control system. # It's strongly recommended to check this file into your version control system.
ActiveRecord::Schema.define(:version => 20101216180143) do ActiveRecord::Schema.define(:version => 20111013085444) do
create_table "admin_users", :force => true do |t| create_table "admin_users", :force => true do |t|
t.string "first_name", :default => "", :null => false t.string "email", :default => "", :null => false
t.string "last_name", :default => "", :null => false t.string "encrypted_password", :limit => 128, :default => "", :null => false
t.string "role", :null => false t.string "reset_password_token"
t.string "email", :null => false t.datetime "reset_password_sent_at"
t.boolean "status", :default => false t.datetime "remember_created_at"
t.string "token", :null => false t.integer "sign_in_count", :default => 0
t.string "salt", :null => false t.datetime "current_sign_in_at"
t.string "crypted_password", :null => false t.datetime "last_sign_in_at"
t.string "preferences" t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.string "confirmation_token"
t.datetime "confirmed_at"
t.datetime "confirmation_sent_at"
t.integer "failed_attempts", :default => 0
t.string "unlock_token"
t.datetime "locked_at"
t.datetime "created_at" t.datetime "created_at"
t.datetime "updated_at" t.datetime "updated_at"
end end

BIN
logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

241
public/index.html_ Normal file
View File

@ -0,0 +1,241 @@
<!DOCTYPE html>
<html>
<head>
<title>Ruby on Rails: Welcome aboard</title>
<style type="text/css" media="screen">
body {
margin: 0;
margin-bottom: 25px;
padding: 0;
background-color: #f0f0f0;
font-family: "Lucida Grande", "Bitstream Vera Sans", "Verdana";
font-size: 13px;
color: #333;
}
h1 {
font-size: 28px;
color: #000;
}
a {color: #03c}
a:hover {
background-color: #03c;
color: white;
text-decoration: none;
}
#page {
background-color: #f0f0f0;
width: 750px;
margin: 0;
margin-left: auto;
margin-right: auto;
}
#content {
float: left;
background-color: white;
border: 3px solid #aaa;
border-top: none;
padding: 25px;
width: 500px;
}
#sidebar {
float: right;
width: 175px;
}
#footer {
clear: both;
}
#header, #about, #getting-started {
padding-left: 75px;
padding-right: 30px;
}
#header {
background-image: url("/assets/rails.png");
background-repeat: no-repeat;
background-position: top left;
height: 64px;
}
#header h1, #header h2 {margin: 0}
#header h2 {
color: #888;
font-weight: normal;
font-size: 16px;
}
#about h3 {
margin: 0;
margin-bottom: 10px;
font-size: 14px;
}
#about-content {
background-color: #ffd;
border: 1px solid #fc0;
margin-left: -55px;
margin-right: -10px;
}
#about-content table {
margin-top: 10px;
margin-bottom: 10px;
font-size: 11px;
border-collapse: collapse;
}
#about-content td {
padding: 10px;
padding-top: 3px;
padding-bottom: 3px;
}
#about-content td.name {color: #555}
#about-content td.value {color: #000}
#about-content ul {
padding: 0;
list-style-type: none;
}
#about-content.failure {
background-color: #fcc;
border: 1px solid #f00;
}
#about-content.failure p {
margin: 0;
padding: 10px;
}
#getting-started {
border-top: 1px solid #ccc;
margin-top: 25px;
padding-top: 15px;
}
#getting-started h1 {
margin: 0;
font-size: 20px;
}
#getting-started h2 {
margin: 0;
font-size: 14px;
font-weight: normal;
color: #333;
margin-bottom: 25px;
}
#getting-started ol {
margin-left: 0;
padding-left: 0;
}
#getting-started li {
font-size: 18px;
color: #888;
margin-bottom: 25px;
}
#getting-started li h2 {
margin: 0;
font-weight: normal;
font-size: 18px;
color: #333;
}
#getting-started li p {
color: #555;
font-size: 13px;
}
#sidebar ul {
margin-left: 0;
padding-left: 0;
}
#sidebar ul h3 {
margin-top: 25px;
font-size: 16px;
padding-bottom: 10px;
border-bottom: 1px solid #ccc;
}
#sidebar li {
list-style-type: none;
}
#sidebar ul.links li {
margin-bottom: 5px;
}
.filename {
font-style: italic;
}
</style>
<script type="text/javascript">
function about() {
info = document.getElementById('about-content');
if (window.XMLHttpRequest)
{ xhr = new XMLHttpRequest(); }
else
{ xhr = new ActiveXObject("Microsoft.XMLHTTP"); }
xhr.open("GET","rails/info/properties",false);
xhr.send("");
info.innerHTML = xhr.responseText;
info.style.display = 'block'
}
</script>
</head>
<body>
<div id="page">
<div id="sidebar">
<ul id="sidebar-items">
<li>
<h3>Browse the documentation</h3>
<ul class="links">
<li><a href="http://guides.rubyonrails.org/">Rails Guides</a></li>
<li><a href="http://api.rubyonrails.org/">Rails API</a></li>
<li><a href="http://www.ruby-doc.org/core/">Ruby core</a></li>
<li><a href="http://www.ruby-doc.org/stdlib/">Ruby standard library</a></li>
</ul>
</li>
</ul>
</div>
<div id="content">
<div id="header">
<h1>Welcome aboard</h1>
<h2>You&rsquo;re riding Ruby on Rails!</h2>
</div>
<div id="about">
<h3><a href="rails/info/properties" onclick="about(); return false">About your application&rsquo;s environment</a></h3>
<div id="about-content" style="display: none"></div>
</div>
<div id="getting-started">
<h1>Getting started</h1>
<h2>Here&rsquo;s how to get rolling:</h2>
<ol>
<li>
<h2>Use <code>rails generate</code> to create your models and controllers</h2>
<p>To see all available options, run it without parameters.</p>
</li>
<li>
<h2>Set up a default route and remove <span class="filename">public/index.html</span></h2>
<p>Routes are set up in <span class="filename">config/routes.rb</span>.</p>
</li>
<li>
<h2>Create your database</h2>
<p>Run <code>rake db:create</code> to create your database. If you're not using SQLite (the default), edit <span class="filename">config/database.yml</span> with your username and password.</p>
</li>
</ol>
</div>
</div>
<div id="footer">&nbsp;</div>
</div>
</body>
</html>

11
test/fixtures/admin_users.yml vendored Normal file
View File

@ -0,0 +1,11 @@
# Read about fixtures at http://api.rubyonrails.org/classes/Fixtures.html
# This model initially had no columns defined. If you add columns to the
# model remove the '{}' from the fixture names and add the columns immediately
# below each fixture, per the syntax in the comments below
#
one: {}
# column: value
#
two: {}
# column: value

View File

@ -0,0 +1,7 @@
require 'test_helper'
class Admin::AdminControllerTest < ActionController::TestCase
# test "the truth" do
# assert true
# end
end

View File

@ -0,0 +1,7 @@
require 'test_helper'
class Admin::DashboardControllerTest < ActionController::TestCase
# test "the truth" do
# assert true
# end
end

View File

@ -0,0 +1,7 @@
require 'test_helper'
class Admin::DownloadsControllerTest < ActionController::TestCase
# test "the truth" do
# assert true
# end
end

View File

@ -0,0 +1,7 @@
require 'test_helper'
class Admin::UnlocksControllerTest < ActionController::TestCase
# test "the truth" do
# assert true
# end
end

View File

@ -0,0 +1,7 @@
require 'test_helper'
class HomeControllerTest < ActionController::TestCase
# test "the truth" do
# assert true
# end
end

View File

@ -0,0 +1,7 @@
require 'test_helper'
class AdminUserTest < ActiveSupport::TestCase
# test "the truth" do
# assert true
# end
end

View File

@ -0,0 +1,4 @@
require 'test_helper'
class Admin::AdminHelperTest < ActionView::TestCase
end

View File

@ -0,0 +1,4 @@
require 'test_helper'
class Admin::DashboardHelperTest < ActionView::TestCase
end

View File

@ -0,0 +1,4 @@
require 'test_helper'
class Admin::DownloadsHelperTest < ActionView::TestCase
end

View File

@ -0,0 +1,4 @@
require 'test_helper'
class Admin::UnlocksHelperTest < ActionView::TestCase
end

View File

@ -0,0 +1,4 @@
require 'test_helper'
class HomeHelperTest < ActionView::TestCase
end