colinschoen/enrollme

View on GitHub
app/controllers/admins_controller.rb

Summary

Maintainability
B
4 hrs
Test Coverage
class AdminsController < ApplicationController
  skip_before_filter :authenticate, :only => ['new', 'create']
  before_filter :validate_admin, :set_admin, :except => ['new', 'create']

  def new
    @admin = Admin.new
    render 'new'
  end

  def create
    @admin = Admin.new(admin_params)
    @admin.superadmin = false
    if session[:is_admin] == true and @admin.save
      AdminMailer.invite_new_admin(@admin).deliver_now
      redirect_to admins_path, :notice => "You created admin \
                        #{admin_params['name']} successfully!"
    else
      render 'new', :notice => "Form is invalid"
    end
  end

  def update
    @admin.update_attributes!(admin_params)
    return redirect_to admins_path
  end

  def index
    status = params[:status]
    @status = status
    @teams_li = Team.filter_by(status)
    render 'index'
  end

  def approve
    @team = Team.find_by_id(params[:team_id])
    @team.approved = true
    @team.save!

    AdminMailer.send_approved_email(@team).deliver_now

    if !(params[:disc].nil?)
      Team.find_by_id(params[:team_id]).approve_with_discussion(params[:disc])
    end
    redirect_to admins_path
  end

  def disapprove
    @team = Team.find_by_id(params[:team_id])
    @team.approved = false
    @team.save!

    #AdminMailer.send_disapproved_email(@team).deliver_now

    Team.find_by_id(params[:team_id]).disapprove
    redirect_to admins_path
  end

  def undo_approve
    @team = Team.find_by_id(params[:team_id])
    @team.approved = false
    @team.save!
    
    AdminMailer.send_disapproved_email(@team).deliver_now
    
    Team.find_by_id(params[:team_id]).withdraw_approval
    redirect_to admins_path
  end
  
  def team_list_email
    # AdminMailer.team_list_email(@admin).deliver_now
    redirect_to admins_path
  end
  
  def superadmin
    render "super"
  end
  
  def reset_semester
    render "reset"
  end
  
  def reset_database
    @reset_password = params[:reset_password]
    if @reset_password == ENV["ADMIN_DELETE_DATA_PASSWORD"]
      AdminMailer.all_data(@admin).deliver_now unless Rails.env.test?
      delete_all_database_columns
      redirect_to "/", :notice => "All data reset. Good luck with the new semester!"
    else
      redirect_to reset_semester_path, :notice => "Incorrect password"
    end
  end

  def transfer
    if @admin.superadmin == true and params[:transfer_admin] != nil
      other_admin = Admin.find(params[:transfer_admin])
      @admin.superadmin = false
      other_admin.superadmin = true
      @admin.save!
      other_admin.save!
      notice = "Successfully transferred superadmin powers."
    elsif @admin.superadmin == true and params[:transfer_admin] === nil
      notice = "No admin selected for transfer."
    else
      notice = "You don't have permission to do that."
    end
    redirect_to superadmin_path, :notice => notice
  end

  def delete
    if @admin.superadmin == true
      c = 0
      for a in Admin.all
        if params.has_key? "delete_#{a.name}"
          a.destroy!
          c += 1
        end
      end

      if c == 1
        notice = "#{c} admin successfully deleted."
      else
        notice = "#{c} admins successfully deleted."
      end
    else
      notice = "You do not have sufficient permissions to do that."
    end
    redirect_to superadmin_path, :notice => notice
  end

  def destroy
    if @admin.superadmin == false
      @admin.destroy!
      notice = "You have successfully deleted your admin account."
    else
      notice = "Please give someone else superadmin powers before deleting yourself."
    end
    redirect_to '/', :notice => notice
  end

  def skills
    @skills = Skill.where(:active => true)
    render 'skills'
  end

  def add_skill
    skill_name = params[:skill].titleize
    existing_skill = Skill.where(:name => skill_name).first
    if existing_skill
      if existing_skill.active
        notice = "Skill #{skill_name} already exists."
        return redirect_to skills_path, :notice => notice
      else
        existing_skill.active = true
        existing_skill.save
      end
    else
      skill = Skill.new(:name => skill_name, :active => true)
      skill.save!
    end
    notice = "Skill #{skill_name} successfully created."
    redirect_to skills_path, :notice => notice
  end

  def delete_skill
    skill = Skill.find_by_id(params[:id])
    if !skill
      notice = "Could not find skill to be deleted."
    else
      notice = "Sucessfully deleted #{skill.name}."
      skill.active = false
      skill.save
    end
    redirect_to skills_path, :notice => notice
  end

  def edit_skill
    @skill = Skill.find_by_id(params[:id])
    if request.patch?
      notice = edit_skill_populated_name_check(params[:name])
      redirect_to skills_path, :notice => notice
    else
      render 'edit_skill'
    end
  end

  private

  def validate_admin
    if !(session[:is_admin])
      redirect_to '/', :notice => "Permission denied"
    end
  end

  def set_admin
    @admin = Admin.find_by_id session[:user_id]
  end

  def admin_params
    params.require(:admin).permit(:name, :email)
  end

  def admin_tutorial
    render 'admin_tutorial'
  end

  def delete_all_database_columns
    User.delete_all
    Team.delete_all
    Submission.delete_all
    Discussion.delete_all
  end

  def edit_skill_populated_name_check(edit_name)
    if Skill.where(:name => edit_name).blank?
      return edit_skill_non_populated_name(@skill, edit_name)
    else
      return edit_skill_populated_name(edit_name)
    end
  end

  def edit_skill_populated_name(edit_name)
    existing_skill = Skill.where(:name => edit_name)[0]
    if !existing_skill.active
      return edit_skill_populated_name_active(@skill, existing_skill)
    else
      return "#{existing_skill.name} skill already exists."
    end
  end

  def edit_skill_non_populated_name(skill, edit_skill_name)
    skill.name = edit_skill_name
    skill.save
    return "#{skill.name} skill name updated successfully."
  end

  def edit_skill_populated_name_active(skill, existing_skill)
    existing_skill.active = true
    existing_skill.save
    skill = existing_skill
    return "#{skill.name} skill name updated successfully."
  end
end