Skip to content

Commit

Permalink
Added jobs management in admin panel and simple authentication system
Browse files Browse the repository at this point in the history
  • Loading branch information
wlodars committed Jul 4, 2008
1 parent df546a2 commit e8a40d4
Show file tree
Hide file tree
Showing 43 changed files with 532 additions and 50 deletions.
10 changes: 10 additions & 0 deletions app/controllers/admin/categories_controller.rb
@@ -0,0 +1,10 @@
class Admin::CategoriesController < ApplicationController
before_filter :login_required
layout 'admin'

# GET /admin/jobs/1
def show
@category = Category.find_by_value(params[:id])
@jobs = @category.jobs.find_all_by_is_active(true, :order => "created_at DESC")
end
end
37 changes: 37 additions & 0 deletions app/controllers/admin/jobs_controller.rb
@@ -0,0 +1,37 @@
class Admin::JobsController < ApplicationController
before_filter :login_required
layout 'admin'

# GET /admin/jobs
def index
@jobs = Job.find_all_by_is_active(false, :order => 'updated_at DESC')
end

# GET /admin/jobs/1
def show
@job = Job.find(params[:id])
end

# PUT /admin/jobs/1
def update
@job = Job.find(params[:id])

respond_to do |format|
if @job.update_attributes(:is_active => @job.is_active ? false : true)
format.html { redirect_to admin_jobs_url }
format.js # admin/jobs/update.js.rjs
end
end
end

# DELETE /admin/jobs/1
def destroy
@job = Job.find(params[:id])
@job.destroy

respond_to do |format|
format.html { redirect_to admin_jobs_url }
format.js # admin/jobs/destroy.js.rjs
end
end
end
9 changes: 8 additions & 1 deletion app/controllers/application.rb
Expand Up @@ -13,7 +13,14 @@ class ApplicationController < ActionController::Base
# Uncomment this to filter the contents of submitted sensitive data parameters
# from your application log (in this case, all fields with names like "password").
filter_parameter_logging :password


def login_required
unless session[:admin]
flash[:notice] = "Please log in."
redirect_to login_url
end
end

protected
def production?
ENV["RAILS_ENV"] == "production"
Expand Down
27 changes: 27 additions & 0 deletions app/controllers/sessions_controller.rb
@@ -0,0 +1,27 @@
class SessionsController < ApplicationController
layout 'admin'

def new
if session[:admin]
redirect_to admin_url
end
end

def create
admin = Admin.authenticate(params[:login], params[:password])
if admin
session[:admin] = admin
flash[:notice] = "You are logged as #{admin.login}"
redirect_to admin_url
else
flash[:error] = "Invalid login or password!"
render :action => :new
end
end

def destroy
reset_session
flash[:notice] = "You've been logged out."
redirect_to login_url
end
end
5 changes: 5 additions & 0 deletions app/helpers/admin/categories_helper.rb
@@ -0,0 +1,5 @@
module Admin::CategoriesHelper
def admin_category_nav_item(category)
category_nav_item(category, true)
end
end
9 changes: 9 additions & 0 deletions app/helpers/admin/jobs_helper.rb
@@ -0,0 +1,9 @@
module Admin::JobsHelper
def activation_image_tag(job)
activate = "activate"
unless job.is_active
activate = "de" + activate
end
image_tag("icon_#{activate}.gif", :alt => activate.capitalize, :id => "activate_#{job.id}")
end
end
1 change: 0 additions & 1 deletion app/helpers/application_helper.rb
Expand Up @@ -22,5 +22,4 @@ def error_message_for(record, attribute, error_msg = nil)
return content_tag(:div, error_msg || error_list.join(", "), :class => "error-message")
end
end

end
4 changes: 2 additions & 2 deletions app/helpers/categories_helper.rb
@@ -1,5 +1,5 @@
module CategoriesHelper
def category_nav_item(category)
def category_nav_item(category, admin = false)

li_options = {}

Expand All @@ -8,7 +8,7 @@ def category_nav_item(category)
li_options[:class] = "selected"
end

link = link_to "<span>#{category.name}</span><span class='cnr'>&nbsp;</span>", category_url(category), :title => category.name
link = link_to "<span>#{category.name.pluralize}</span><span class='cnr'>&nbsp;</span>", (admin ? admin_category_url(category) : category_url(category)), :title => category.name.pluralize

return content_tag(:li, link, li_options)
end
Expand Down
2 changes: 1 addition & 1 deletion app/helpers/jobs_helper.rb
Expand Up @@ -17,7 +17,7 @@ def job_location_text(job)
puts ", #{job.location}"
elsif !job.location.blank?
haml_tag :span, "in", :class => "la"
puts " #{job.location}"
puts " #{job.location.name}"
end
end
end
Expand Down
11 changes: 11 additions & 0 deletions app/helpers/sessions_helper.rb
@@ -0,0 +1,11 @@
module SessionsHelper
# checks if user is logged in
def logged_in?
session[:admin] ? true : false
end

# returns currently logged admin
def current_user
session[:admin]
end
end
20 changes: 20 additions & 0 deletions app/models/admin.rb
@@ -0,0 +1,20 @@
require 'digest/sha1'

class Admin < ActiveRecord::Base
validates_length_of :login, :within => 3..40
validates_length_of :password, :within => 5..40
validates_presence_of :login, :password
validates_uniqueness_of :login

attr_protected :id

def self.authenticate(login, pass)
a = find_by_login(login)
a && Admin.encrypt(pass) == a.password ? a : nil
end

protected
def self.encrypt(pass)
Digest::SHA1.hexdigest(pass)
end
end
5 changes: 5 additions & 0 deletions app/views/admin/categories/_list.html.haml
@@ -0,0 +1,5 @@
#categories
%ul
- Category.list.each do |category|
= admin_category_nav_item(category)
= clear
3 changes: 3 additions & 0 deletions app/views/admin/categories/show.html.haml
@@ -0,0 +1,3 @@
.job-listings
%h2= "Jobs for " + @category.name.pluralize
= partial "admin/jobs/jobs_table", :jobs => @jobs
24 changes: 24 additions & 0 deletions app/views/admin/jobs/_jobs_table.html.haml
@@ -0,0 +1,24 @@
- unless jobs.empty?
-# Display Job Posts
%table.job-posts{:cellspacing => 0}
- jobs.each do |job|
%tr.job_item{:id => "job_" + job.id.to_s}
%td
= job_type_image(job.job_type)
= link_to job.title, admin_job_url(job), :title => job.title
%span.la at
= job_location_text(job)

-# display time
%td.time-posted
= image_tag "clock.gif", :class => "vert-middle"
= job.created_at.to_s(:job_listing)

%td{:style => 'text-align:left;width:15%'}
-# activate/deactivate link
= link_to_remote(activation_image_tag(job), :url => admin_job_url(job.id), :method => :put)
-# delete link
= link_to_remote(image_tag("icon-delete.png", :alt => 'Delete'), :url => admin_job_url(job.id), :confirm => 'Are you sure you want to delete this post?', :method => :delete)

- else
#no-ads No jobs, yet.
1 change: 1 addition & 0 deletions app/views/admin/jobs/destroy.js.rjs
@@ -0,0 +1 @@
page["job_#{@job.id}"].visual_effect :fade, "job_#{@job.id}"
2 changes: 2 additions & 0 deletions app/views/admin/jobs/index.html.haml
@@ -0,0 +1,2 @@
%h2 Inactive jobs
= partial "admin/jobs/jobs_table", :jobs => @jobs
51 changes: 51 additions & 0 deletions app/views/admin/jobs/show.html.haml
@@ -0,0 +1,51 @@
- if @job
= br
= link_to '« go back', admin_category_url(@job.category)
#job_details
-# display job outdated warning if applicable
- if @job.created_at < 40.days.ago
.old-ad
This job ad has been posted over 40 days ago...

-# show applicants count
.applied-to-job
= @job.job_applicants.size
%p
- if @job.job_applicants.size != 1
applicants
- else
applicant

-# show job title
%h2
= job_type_image(@job.job_type)
= @job.title

-# show job location
%p
%span.fading at
- unless @job.url.blank? or @job.url == "http://"
= link_to @job.company, @job.url
- else
%strong= @job.company

- if @job.located_at == "Anywhere"
%strong= "(" + @job.located_at + ")"
- else
%span.fading in
%strong= @job.located_at

-# show job description
.job-description
= @job.description_html
= br

#job_bottom
#number_views
Published at:
%strong= @job.created_at.to_s(:post_listing_date)
= br
Viewed:
%strong= pluralize(@job.view_count, "time")
= clear

1 change: 1 addition & 0 deletions app/views/admin/jobs/update.js.rjs
@@ -0,0 +1 @@
page.replace "activate_#{@job.id}", activation_image_tag(@job)
16 changes: 16 additions & 0 deletions app/views/layouts/_admin_header.html.haml
@@ -0,0 +1,16 @@
#header
%h1#logo= link_to AppConfig.site_name, root_path
- if logged_in?
%ul#top
%li= link_to "Pages", "#"
= bull
%li= link_to "Categories", "#"
= bull
%li= link_to "Change your password", "#"
= bull
%li= link_to "Logout", logout_path

= partial "layouts/flash_boxes"

- unless logged_in?
#categs-nav
19 changes: 19 additions & 0 deletions app/views/layouts/admin.html.haml
@@ -0,0 +1,19 @@
!!! Strict
%html{html_attrs}
%head
%meta{"http-equiv" => "Content-type", "content" => "text/html; charset=utf-8"}
= title :site => AppConfig.site_name
= stylesheets
= javascripts
= feed_links
%body
#container
= partial "layouts/admin_header"
- if logged_in?
= partial "admin/categories/list"
#content
= yield
2 changes: 1 addition & 1 deletion app/views/layouts/application.html.haml
Expand Up @@ -11,7 +11,7 @@
%body
#container
= partial "session/login_status"
= partial "sessions/login_status"
= partial "layouts/header"
= partial "search/searchbox"
= partial "categories/list"
Expand Down
Empty file.
5 changes: 5 additions & 0 deletions app/views/sessions/_login_status.html.haml
@@ -0,0 +1,5 @@
.login_status
- if logged_in?
= "You are logged as #{current_user.login} " + link_to('Logout', logout_path)
- else
= link_to 'Login', login_path
12 changes: 12 additions & 0 deletions app/views/sessions/new.html.haml
@@ -0,0 +1,12 @@
- form_tag session_path, :id => 'publish_form' do
%fieldset
%legend Login
%table{:border => 0, :cellspacing => 2, :cellpadding => 2}
%tr
%td.publish-label Username:
%td= text_field_tag :login, params[:login], :size => 40
%tr
%td.publish-label Password:
%td= password_field_tag :password, params[:password], :size => 40
%fieldset
= submit_tag 'Login', :id => 'submit'
15 changes: 11 additions & 4 deletions config/routes.rb
@@ -1,5 +1,9 @@
ActionController::Routing::Routes.draw do |map|

map.login '/login', :controller => 'sessions', :action => 'new'
map.logout '/logout', :controller => 'sessions', :action => 'destroy'
map.resource :session

map.resources :jobs, :member => {
:verify => :any,
:apply => :post,
Expand All @@ -11,10 +15,13 @@
map.resources :categories
map.resource :search, :controller => "Search"

# map.namespace :admin do |admin|
# # Directs /admin/jobs/* to Admin::JobsController (app/controllers/admin/jobs_controller.rb)
# admin.resources :jobs
# end
map.admin '/admin', :controller => 'admin/jobs', :action => 'index'
map.namespace :admin do |admin|
# Directs /admin/jobs/* to Admin::JobsController (app/controllers/admin/jobs_controller.rb)
admin.resources :jobs
# Directs /admin/categories/* to Admin::CategoriesController (app/controllers/admin/categories_controller.rb)
admin.resources :categories
end

map.root :controller => "jobs"

Expand Down
4 changes: 4 additions & 0 deletions db/fixtures/admins.rb
@@ -0,0 +1,4 @@
Admin.seed(:login, :password) do |s|
s.login = 'admin'
s.password = 'd033e22ae348aeb5660fc2140aec35850c4da997' # admin
end
15 changes: 15 additions & 0 deletions db/migrate/20080703181307_create_admins.rb
@@ -0,0 +1,15 @@
class CreateAdmins < ActiveRecord::Migration
def self.up
create_table :admins do |t|
t.string :login
t.string :password

t.timestamps
end

end

def self.down
drop_table :admins
end
end

0 comments on commit e8a40d4

Please sign in to comment.