Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require 'rubygems'
- require 'digest'
- require 'sinatra'
- require 'dm-core'
- require 'dm-timestamps'
- require 'haml'
- use Rack::Session::Cookie, :key => 'timeclock', :expire_after => 600
- class User
- include DataMapper::Resource
- has n, :punches
- property :id, Serial
- property :username, String, :length => 10, :unique => true
- property :password, String, :length => 40
- property :punched_in, Boolean, :default => false
- property :session_id, String, :length => 32, :unique => true
- def password=(txt)
- attribute_set(:password, Digest::SHA1.hexdigest(txt))
- end
- end
- class Punch
- include DataMapper::Resource
- belongs_to :user
- property :id, Serial
- property :user_id, Integer
- property :type, Boolean
- property :created_at, DateTime
- end
- DataMapper.setup(:default, :adapter => 'sqlite3', :database => 'dev.sqlite')
- DataMapper.auto_upgrade!
- User.create(:username => 'brian', :password => 'test') unless User.first(:username => 'brian')
- User.create(:username => 'will', :password => 'test') unless User.first(:username => 'will')
- get '/' do
- haml :index
- end
- get '/punch' do
- auth!
- @user = User.first(:session_id => session[:id])
- haml :punch
- end
- get '/login' do
- haml :login
- end
- post '/login' do
- u = User.new(params[:user])
- user = User.first(:username => u.username, :password => u.password)
- if user
- session[:logged_in] = true
- hash = Digest::MD5.hexdigest(u.username)
- session[:message] = nil
- session[:id] = hash #user.id
- user.session_id = hash
- session[:key] = 'timeclock'
- user.save
- redirect '/'
- else
- session[:message] = 'Invalid Login'
- session[:logged_in] = nil
- redirect '/login'
- end
- end
- get '/logout' do
- auth!
- u = User.first(:session_id => session[:id])
- u.session_id = nil
- u.save
- session[:logged_in] = nil
- session[:id] = nil
- session[:message] = nil
- redirect '/login'
- end
- get '/history' do
- auth!
- @user = User.first(:session_id => session[:id])
- haml :list
- end
- post '/punch' do
- auth!
- user = User.first(:session_id => session[:id])
- user.punched_in = !user.punched_in?
- user.punches.create(:type => user.punched_in)
- user.save
- redirect('/punch')
- end
- helpers do
- def auth!
- redirect('/login') unless session[:logged_in]
- end
- end
- __END__
- @@ layout
- !!! Strict
- %html{html_attrs}
- %head
- -#%link{:rel=>"stylesheet", :type => "text/css", :href => "/style.css"}
- :css
- body {
- background-color: #cdd0ce;
- padding: 0px;
- margin: 0px;
- }
- #nav {
- word-spacing: 10px;
- background-color: #FFFFFF;
- padding: 2px;
- padding-right: 5px;
- margin: 0px;
- top: 0px;
- border-bottom: 2px ridge;
- text-align: right;
- }
- #nav a.home {
- float: left;
- margin-left: 5px;
- }
- #content {
- margin-top: 30px;
- margin-left: 10%;
- }
- form {
- position: relative;
- }
- form p {
- margin: 5px;
- padding: 0px;
- }
- form label {
- display: block;
- float: left;
- width: 5em;
- text-align: right;
- padding-right: 10px;
- }
- %body
- #nav
- %a.home{:href => "/"} Home
- - if session[:logged_in]
- %a{:href => "/punch"} Punch
- %a{:href => "/history"} History
- %a{:href => "/logout"} Logout
- - else
- %a{:href => "/login"} Login
- #content
- -if session[:logged_in]
- %h1 Hello #{User.first(:session_id => session[:id]).username.strip}
- = yield
- @@ index
- %p Welcome to TimeClock!
- - unless session[:logged_in]
- %p Please login to actually do stuff
- @@ punch
- %form{:method => "post", :action => "/punch"}
- %p
- - if @user.punched_in?
- %input{:type => "submit", :value => "Punch Out"}
- - else
- %input{:type => "submit", :value => "Punch In"}
- @@ list
- %table
- %thead
- %th Type
- %th Date
- %tbody
- -@user.punches.reverse_each do |p|
- %tr
- %td= p.type ? 'In' : 'Out'
- %td= p.created_at
- @@ login
- %form{:method => "post"}
- %p
- %label{:for => "user_username"} Username:
- %input{:type => "text", :id => "user_username", :name => "user[username]"}
- %p
- %label{:for => "user_password"} Password:
- %input{:type => "password", :id => "user_password", :name => "user[password]"}
- %p
- %input{:type => "submit"}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement