Advertisement
Guest User

Untitled

a guest
May 29th, 2017
518
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rails 4.15 KB | None | 0 0
  1. require 'rubygems'
  2. require 'digest'
  3. require 'sinatra'
  4. require 'dm-core'
  5. require 'dm-timestamps'
  6. require 'haml'
  7.  
  8. use Rack::Session::Cookie, :key => 'timeclock', :expire_after => 600
  9.  
  10. class User
  11.     include DataMapper::Resource
  12.     has n, :punches
  13.     property :id, Serial
  14.     property :username, String, :length => 10, :unique => true
  15.     property :password, String, :length => 40
  16.     property :punched_in, Boolean, :default => false
  17.     property :session_id, String, :length => 32, :unique => true
  18.    
  19.     def password=(txt)
  20.         attribute_set(:password, Digest::SHA1.hexdigest(txt))
  21.     end
  22. end
  23.  
  24. class Punch
  25.     include DataMapper::Resource
  26.     belongs_to :user
  27.     property :id, Serial
  28.     property :user_id, Integer
  29.     property :type, Boolean
  30.     property :created_at, DateTime
  31. end
  32.  
  33. DataMapper.setup(:default, :adapter => 'sqlite3', :database => 'dev.sqlite')
  34. DataMapper.auto_upgrade!
  35. User.create(:username => 'brian', :password => 'test') unless User.first(:username => 'brian')
  36. User.create(:username => 'will', :password => 'test') unless User.first(:username => 'will')
  37.  
  38. get '/' do
  39.     haml :index
  40. end
  41.  
  42. get '/punch' do
  43.     auth!
  44.     @user = User.first(:session_id => session[:id])
  45.     haml :punch
  46. end
  47.  
  48. get '/login' do
  49.     haml :login
  50. end
  51.  
  52. post '/login' do
  53.     u = User.new(params[:user])
  54.     user = User.first(:username => u.username, :password => u.password)
  55.     if user
  56.         session[:logged_in] = true
  57.         hash = Digest::MD5.hexdigest(u.username)
  58.         session[:message] = nil
  59.         session[:id] = hash #user.id
  60.         user.session_id = hash
  61.         session[:key] = 'timeclock'
  62.         user.save
  63.         redirect '/'
  64.     else
  65.         session[:message] = 'Invalid Login'
  66.         session[:logged_in] = nil
  67.         redirect '/login'
  68.     end
  69. end
  70.  
  71. get '/logout' do
  72.     auth!
  73.     u = User.first(:session_id => session[:id])
  74.     u.session_id = nil
  75.     u.save
  76.     session[:logged_in] = nil
  77.     session[:id] = nil
  78.     session[:message] = nil
  79.     redirect '/login'
  80. end
  81.  
  82. get '/history' do
  83.     auth!
  84.     @user = User.first(:session_id => session[:id])
  85.     haml :list
  86. end
  87.  
  88. post '/punch' do
  89.     auth!
  90.     user = User.first(:session_id => session[:id])
  91.     user.punched_in = !user.punched_in?
  92.     user.punches.create(:type => user.punched_in)
  93.     user.save
  94.     redirect('/punch')
  95. end
  96.  
  97. helpers do
  98.     def auth!
  99.         redirect('/login') unless session[:logged_in]
  100.     end
  101. end
  102.  
  103. __END__
  104. @@ layout
  105. !!! Strict
  106. %html{html_attrs}
  107.     %head
  108.         -#%link{:rel=>"stylesheet", :type => "text/css", :href => "/style.css"}
  109.         :css
  110.             body {
  111.                 background-color: #cdd0ce;
  112.                 padding: 0px;
  113.                 margin: 0px;
  114.             }
  115.            
  116.             #nav {
  117.                 word-spacing: 10px;
  118.                 background-color: #FFFFFF;
  119.                 padding: 2px;
  120.                 padding-right: 5px;
  121.                 margin: 0px;
  122.                 top: 0px;
  123.                 border-bottom: 2px ridge;
  124.                 text-align: right;
  125.             }
  126.            
  127.             #nav a.home {
  128.                 float: left;
  129.                 margin-left: 5px;
  130.             }
  131.            
  132.             #content {
  133.                 margin-top: 30px;
  134.                 margin-left: 10%;
  135.             }
  136.            
  137.             form {
  138.                 position: relative;
  139.             }
  140.            
  141.             form p {
  142.                 margin: 5px;
  143.                 padding: 0px;
  144.             }
  145.            
  146.             form label {
  147.                 display: block;
  148.                 float: left;
  149.                 width: 5em;
  150.                 text-align: right;
  151.                 padding-right: 10px;
  152.             }
  153.     %body
  154.         #nav
  155.             %a.home{:href => "/"} Home
  156.             - if session[:logged_in]
  157.                 %a{:href => "/punch"} Punch
  158.                 %a{:href => "/history"} History
  159.                 %a{:href => "/logout"} Logout
  160.             - else
  161.                 %a{:href => "/login"} Login
  162.         #content
  163.             -if session[:logged_in]
  164.                 %h1 Hello #{User.first(:session_id => session[:id]).username.strip}
  165.             = yield
  166.  
  167. @@ index
  168. %p Welcome to TimeClock!
  169. - unless session[:logged_in]
  170.     %p Please login to actually do stuff
  171.  
  172. @@ punch
  173. %form{:method => "post", :action => "/punch"}
  174.     %p
  175.         - if @user.punched_in?
  176.             %input{:type => "submit", :value => "Punch Out"}
  177.         - else
  178.             %input{:type => "submit", :value => "Punch In"}
  179.  
  180. @@ list
  181. %table
  182.     %thead
  183.         %th Type
  184.         %th Date
  185.     %tbody
  186.         -@user.punches.reverse_each do |p|
  187.             %tr
  188.                 %td= p.type ? 'In' : 'Out'
  189.                 %td= p.created_at
  190.  
  191. @@ login
  192. %form{:method => "post"}
  193.     %p
  194.         %label{:for => "user_username"} Username:
  195.         %input{:type => "text", :id => "user_username", :name => "user[username]"}
  196.     %p
  197.         %label{:for => "user_password"} Password:
  198.         %input{:type => "password", :id => "user_password", :name => "user[password]"}
  199.     %p
  200.         %input{:type => "submit"}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement