did some more refactoring and add more test taking functionality
This commit is contained in:
parent
58551fc668
commit
7987e74a6e
15 changed files with 225 additions and 153 deletions
app
database/migrations
resources/views
admin
tests
user
routes
|
@ -23,6 +23,38 @@ class AdminController extends Controller
|
|||
return view('admin.admin');
|
||||
}
|
||||
|
||||
public function showUser()
|
||||
{
|
||||
$users = User::all();
|
||||
return view('admin.show.users', compact('users'));
|
||||
}
|
||||
|
||||
public function delUser(User $user)
|
||||
{
|
||||
return view('admin.delete.user', compact('user'));
|
||||
}
|
||||
|
||||
public function deleteUser(User $user)
|
||||
{
|
||||
$user->deleteUser();
|
||||
return redirect('/admin/users');
|
||||
}
|
||||
|
||||
public function user()
|
||||
{
|
||||
return view('admin.new.user');
|
||||
}
|
||||
|
||||
public function addUser()
|
||||
{
|
||||
$user = new User;
|
||||
$user->addUser(request()->all());
|
||||
return redirect('/admin/users');
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public function showTests()
|
||||
{
|
||||
$tests = Test::all();
|
||||
|
@ -83,60 +115,6 @@ class AdminController extends Controller
|
|||
return redirect('/admin/tests');
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function showUser()
|
||||
{
|
||||
$users = User::all();
|
||||
return view('admin.show.users', compact('users'));
|
||||
}
|
||||
|
||||
public function editUser(User $user)
|
||||
{
|
||||
return view('admin.edit.user', compact('user'));
|
||||
}
|
||||
|
||||
public function updateUser(User $user)
|
||||
{
|
||||
$user->updateInfo(request()->all());
|
||||
return redirect('/admin/users');
|
||||
}
|
||||
|
||||
public function delUser(User $user)
|
||||
{
|
||||
return view('admin.delete.user', compact('user'));
|
||||
}
|
||||
|
||||
public function deleteUser(User $user)
|
||||
{
|
||||
$user->deleteUser();
|
||||
return redirect('/admin/users');
|
||||
}
|
||||
|
||||
public function user()
|
||||
{
|
||||
return view('admin.new.user');
|
||||
}
|
||||
|
||||
public function addUser()
|
||||
{
|
||||
$user = new User;
|
||||
$user->name = request()->name;
|
||||
$user->email = request()->email;
|
||||
$user->password = bcrypt('request()->password');
|
||||
if (!empty(request()->group_id)) {
|
||||
$user->group_id = request()->group_id;
|
||||
}
|
||||
if (!empty(request()->enabled)) {
|
||||
$user->enabled = request()->enabled;
|
||||
}
|
||||
if (!empty(request()->access_level)) {
|
||||
$user->access_level = request()->access_level;
|
||||
}
|
||||
$user->save();
|
||||
return redirect('/admin/users');
|
||||
}
|
||||
|
||||
public function question(Test $test)
|
||||
{
|
||||
$question_number = count($test->questions)+1;
|
||||
|
@ -146,6 +124,7 @@ class AdminController extends Controller
|
|||
public function addQuestion(Test $test)
|
||||
{
|
||||
$question = new Question;
|
||||
$question->title = request()->title;
|
||||
$question->question = request()->question;
|
||||
if (empty(Option::all()->last()->id)) {
|
||||
$question->answer_id = 1;
|
||||
|
|
|
@ -5,6 +5,7 @@ namespace App\Http\Controllers;
|
|||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use App\Test;
|
||||
use App\User;
|
||||
|
||||
class HomeController extends Controller
|
||||
{
|
||||
|
@ -40,24 +41,17 @@ class HomeController extends Controller
|
|||
return view('user.settings', compact('user'));
|
||||
}
|
||||
|
||||
public function updateSettings()
|
||||
public function updatePassword()
|
||||
{
|
||||
$user = Auth::user();
|
||||
$email = request()->email;
|
||||
$old_password = request()->old_password;
|
||||
$new_password1 = request()->new_password1;
|
||||
$new_password2 = request()->new_password2;
|
||||
$user->updatePassword(request()->all());
|
||||
return redirect('/settings');
|
||||
}
|
||||
|
||||
if (!empty($email)) {
|
||||
$user->email = $email;
|
||||
|
||||
}
|
||||
if ((!empty($old_password)) && ($user->getAuthPassword() == password_verify($old_password, $user->getAuthPassword()))) {
|
||||
if ($new_password1 == $new_password2) {
|
||||
$user->password = password_hash($new_password1, PASSWORD_DEFAULT);
|
||||
}
|
||||
}
|
||||
$user->update();
|
||||
public function updateEmail()
|
||||
{
|
||||
$user = Auth::user();
|
||||
$user->updateEmail(request()->all());
|
||||
return redirect('/settings');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,32 +10,24 @@ class TestController extends Controller
|
|||
{
|
||||
public function startTest(Test $test)
|
||||
{
|
||||
$test_id = $test->id;
|
||||
$question_counter = 1;
|
||||
$wrong_answers = 0;
|
||||
$questions = $test->questions;
|
||||
$rand_questions = $questions->random($test->question_count);
|
||||
$shuffled_questions = $rand_questions->shuffle();
|
||||
session(['questions' => $shuffled_questions, 'question_counter' => $question_counter, 'test_id' => $test_id, 'wrong_answers' => $wrong_answers]);
|
||||
if (!$test->startTest(\Auth::user())) {
|
||||
//session flash
|
||||
return redirect('/home');
|
||||
}
|
||||
return redirect()->action('TestController@showQuestion');
|
||||
}
|
||||
|
||||
public function showQuestion()
|
||||
{
|
||||
$question_counter = session('question_counter');
|
||||
$questions = session('questions');
|
||||
$question = $questions->get($question_counter-1);
|
||||
$options = $question->options;
|
||||
$shuffled_options = $options->shuffle();
|
||||
session(['options' => $shuffled_options]);
|
||||
return view('tests.index', compact('question'), compact('shuffled_options'));
|
||||
$question = session('questions')->get(session('question_counter')-1);
|
||||
$options = $question->options->shuffle();
|
||||
session(['options' => $options]);
|
||||
return view('tests.index', compact('question'), compact('options'));
|
||||
}
|
||||
|
||||
public function answerQuestion()
|
||||
{
|
||||
$questions = session('questions');
|
||||
$question_counter = session('question_counter');
|
||||
$question = $questions->get($question_counter-1);
|
||||
$question = session('questions')->get(session('question_counter')-1);
|
||||
$question_id = $question->id;
|
||||
$answer_id = request()->get('answer');
|
||||
if (!empty(session('answers'))) {
|
||||
|
@ -43,32 +35,47 @@ class TestController extends Controller
|
|||
}
|
||||
$answers["$question_id"] = $answer_id;
|
||||
session(['answers' => $answers]);
|
||||
return redirect()->action('TestController@showAnswer');
|
||||
return redirect()->action('TestController@isCorrect');
|
||||
}
|
||||
|
||||
public function isCorrect()
|
||||
{
|
||||
$question = session('questions')->get(session('question_counter')-1);
|
||||
if (!$question->isCorrect(session('answers')["$question->id"])) {
|
||||
session(['wrong_answers' => session('wrong_answers')+1]);
|
||||
session(['is_correct' => false]);
|
||||
} else {
|
||||
session(['is_correct' => true]);
|
||||
}
|
||||
return redirect()->action('TestController@hasFailed');
|
||||
}
|
||||
|
||||
public function hasFailed()
|
||||
{
|
||||
|
||||
if (session('test')->hasFailed(session('wrong_answers'))) {
|
||||
//Abort logic
|
||||
return redirect('/home');
|
||||
}
|
||||
return redirect()->action('TestController@lastQuestion');
|
||||
}
|
||||
|
||||
public function lastQuestion()
|
||||
{
|
||||
/*if (session('test')->lastQuestion(session('question_counter'))) {
|
||||
|
||||
}*/
|
||||
return redirect()->action('TestController@showAnswer');
|
||||
}
|
||||
|
||||
public function showAnswer()
|
||||
{
|
||||
$question_counter = session('question_counter');
|
||||
$questions = session('questions');
|
||||
$question = $questions->get($question_counter-1);
|
||||
$question_answer = $question->answer_id;
|
||||
$question_counter++;
|
||||
if (request()->get('answer') == $question_answer) {
|
||||
$question = session('questions')->get(session('question_counter')-1);
|
||||
if (session('answers')["$question->id"] == $question->answer_id) {
|
||||
$question_status = "GZ, that was the correct answer!";
|
||||
} else {
|
||||
$question_status = "Sorry, wrong answer, pal!";
|
||||
}
|
||||
session(['question_counter' => $question_counter]);
|
||||
return view('tests.answer', compact('question_status'), compact('question_answer'));
|
||||
session(['question_counter' => session('question_counter')+1]);
|
||||
return view('tests.answer');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,4 +17,11 @@ class Question extends Model
|
|||
{
|
||||
return $this->belongsTo(Test::class);
|
||||
}
|
||||
|
||||
public function isCorrect($user_answer)
|
||||
{
|
||||
if ($user_answer == $this->answer_id) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
24
app/Test.php
24
app/Test.php
|
@ -6,7 +6,7 @@ use Illuminate\Database\Eloquent\Model;
|
|||
|
||||
class Test extends Model
|
||||
{
|
||||
protected $fillable = ["title", "question_count"];
|
||||
protected $fillable = ["title", "question_count", "question_count_to_fail"];
|
||||
|
||||
public function questions()
|
||||
{
|
||||
|
@ -17,4 +17,26 @@ class Test extends Model
|
|||
{
|
||||
return $this->belongsTo(Company::class);
|
||||
}
|
||||
|
||||
public function startTest(User $user)
|
||||
{
|
||||
if ($user->testTaken($this->id)) {
|
||||
return false;
|
||||
}
|
||||
session(['questions' => $this->randomizeQuestions(), 'question_counter' => 1, 'test' => $this, 'wrong_answers' => 0]);
|
||||
return true;
|
||||
}
|
||||
|
||||
public function randomizeQuestions()
|
||||
{
|
||||
return $this->questions->random($this->question_count)->shuffle();
|
||||
}
|
||||
|
||||
public function hasFailed($wrong_answers)
|
||||
{
|
||||
if ($this->question_count_to_fail == null) {
|
||||
return false;
|
||||
}
|
||||
return $this->question_count_to_fail <= $wrong_answers;
|
||||
}
|
||||
}
|
||||
|
|
90
app/User.php
90
app/User.php
|
@ -42,16 +42,41 @@ class User extends Authenticatable
|
|||
return $this->belongsTo(Company::class);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function updateInfo($requestAll)
|
||||
public function passwordHash($password)
|
||||
{
|
||||
$this->name = $requestAll["name"];
|
||||
$this->email = $requestAll["email"];
|
||||
if (!empty($requestAll["password"])) {
|
||||
$this->password = bcrypt($requestAll["password"]);
|
||||
$this->password = password_hash($password, PASSWORD_DEFAULT);
|
||||
}
|
||||
|
||||
public function passwordCompare($password1, $password2)
|
||||
{
|
||||
return $password1 == $password2;
|
||||
}
|
||||
|
||||
public function passwordVerify($password, $hash)
|
||||
{
|
||||
return password_verify($password, $hash);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* Function for adding a user.
|
||||
*
|
||||
*/
|
||||
public function addUser($request)
|
||||
{
|
||||
$user->name = $request["name"];
|
||||
$user->email = $request["email"];
|
||||
$user->passwordHash($request["password"]);
|
||||
if (!empty($request["group_id"])) {
|
||||
$user->group_id = $request["group_id"];
|
||||
}
|
||||
$this->update();
|
||||
if (!empty($request["enabled"])) {
|
||||
$user->enabled = $request["enabled"];
|
||||
}
|
||||
if (!empty($request["access_level"])) {
|
||||
$user->access_level = $request["access_level"];
|
||||
}
|
||||
$user->save();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -78,7 +103,54 @@ class User extends Authenticatable
|
|||
$this->delete();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* Functions for a user to update his/her email and password
|
||||
*
|
||||
*/
|
||||
public function updateEmail($request)
|
||||
{
|
||||
$email = $request['email'];
|
||||
|
||||
$email = trim($email);
|
||||
$this->email = $email;
|
||||
|
||||
$this->update();
|
||||
return true;
|
||||
}
|
||||
|
||||
public function updatePassword($request)
|
||||
{
|
||||
$password_old = $request['password_old'];
|
||||
$password1_new = $request['password1_new'];
|
||||
$password2_new = $request['password2_new'];
|
||||
|
||||
if (!$this->passwordVerify($password_old, $this->password)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!$this->passwordCompare($password1_new, $password2_new)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->passwordHash($password1_new);
|
||||
$this->update();
|
||||
return true;
|
||||
}
|
||||
|
||||
public function testTaken($test_id)
|
||||
{
|
||||
if (!$this->testdetails()->where('test_id', $test_id)->first()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!$this->testdetails()->where('test_id', $test_id)->first()->passed == 1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@ class CreateTestsTable extends Migration
|
|||
$table->string('title');
|
||||
$table->integer('group_id')->unsigned()->index()->nullable();
|
||||
$table->integer('question_count')->unsigned();
|
||||
$table->integer('question_count_to_fail')->unsigned()->nullable();
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
|
|
@ -16,9 +16,12 @@ class CreateTestdetailsTable extends Migration
|
|||
Schema::create('testdetails', function (Blueprint $table) {
|
||||
$table->increments('id');
|
||||
$table->integer('user_id')->unsigned()->index();
|
||||
$table->integer('test_id')->unsigned()->index();
|
||||
$table->integer('passed')->unsigned();
|
||||
$table->integer('correct_answers')->unsigned();
|
||||
$table->integer('test_id')->unsigned()->index();
|
||||
$table->integer('fails')->unsigned()->nullable();
|
||||
$table->integer('passes')->unsigned()->nullable();
|
||||
$table->timestamp('last_passed')->nullable();
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
|
|
@ -1,29 +0,0 @@
|
|||
@extends('layouts.base')
|
||||
|
||||
@section('content')
|
||||
|
||||
<div class="container-fluid">
|
||||
<div class="col-md-4 col-md-offset-4">
|
||||
<h1>Edit User</h1>
|
||||
</br>
|
||||
<form method="POST" action="/admin/users/{{ $user->id }}">
|
||||
{{ csrf_field() }}
|
||||
{{ method_field('PATCH') }}
|
||||
<div class="form-group">
|
||||
<label>Name</label>
|
||||
<input type="text" class="form-control" name="name" value="{{ $user->name }}">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>Email</label>
|
||||
<input type="text" class="form-control" name="email" value="{{ $user->email }}">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>Password</label>
|
||||
<input type="password" class="form-control" name="password" value="">
|
||||
</div>
|
||||
<button type="submit" class="btn btn-default">Submit</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@stop
|
|
@ -7,6 +7,10 @@
|
|||
</br>
|
||||
<form method="POST" action="/admin/tests/{{ $test->id }}/question">
|
||||
{{ csrf_field() }}
|
||||
<div class="form-group">
|
||||
<label>Title</label>
|
||||
<input type="text" class="form-control" name="title">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>Question</label>
|
||||
<input type="text" class="form-control" name="question">
|
||||
|
|
|
@ -16,6 +16,10 @@
|
|||
<label>Number of Questions</label>
|
||||
<input type="text" class="form-control" name="question_count">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>Number of Wrong Questions Allowed</label>
|
||||
<input type="text" class="form-control" name="question_count_to_fail">
|
||||
</div>
|
||||
<button type="submit" class="btn btn-default">Submit</button>
|
||||
</form>
|
||||
</div>
|
||||
|
|
|
@ -7,14 +7,10 @@
|
|||
<div class="panel panel-default">
|
||||
<div class="panel-heading">Answer</div>
|
||||
<div class="panel-body">
|
||||
<h4><strong>{{ $question->title }}</strong></h4>
|
||||
<p>{{ $question->question }}</p>
|
||||
<form method="post" action="/test/answer">
|
||||
<h4><strong>{{ "title" }}</strong></h4>
|
||||
<p>{{ "question" }}</p>
|
||||
<form method="get" action="/test/question">
|
||||
{{ csrf_field() }}
|
||||
@foreach ($shuffled_options as $option)
|
||||
<input type="radio" name="answer" value="{{ $option->id }}"> {{ $option->option }}
|
||||
</br>
|
||||
@endforeach
|
||||
<input type="submit" value="Submit">
|
||||
</form>
|
||||
</div>
|
||||
|
|
|
@ -11,11 +11,11 @@
|
|||
<p>{{ $question->question }}</p>
|
||||
<form method="post" action="/test/question">
|
||||
{{ csrf_field() }}
|
||||
@foreach ($shuffled_options as $option)
|
||||
@foreach ($options as $option)
|
||||
<input type="radio" name="answer" value="{{ $option->id }}"> {{ $option->option }}
|
||||
</br>
|
||||
@endforeach
|
||||
<input type="submit" value="Submit">
|
||||
<button type="submit" class="btn btn-default">Submit</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -5,22 +5,32 @@
|
|||
<div class="row">
|
||||
<div class="col-md-8 col-md-offset-2">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">Tests</div>
|
||||
<div class="panel-heading">Password</div>
|
||||
<div class="panel-body">
|
||||
<form method="post" action="/settings/update">
|
||||
<form method="post" action="/settings/update/password">
|
||||
{{ csrf_field() }}
|
||||
{{ method_field('PATCH') }}
|
||||
<div class="form-group">
|
||||
<h4>Change Password</h4>
|
||||
<label>Old Password</label>
|
||||
<input type="password" class="form-control" name="old_password">
|
||||
<input type="password" class="form-control" name="password_old">
|
||||
<br>
|
||||
<label>New Password</label>
|
||||
<input type="password" class="form-control" name="new_password1">
|
||||
<input type="password" class="form-control" name="password1_new">
|
||||
<br>
|
||||
<label>Repeat New Password</label>
|
||||
<input type="password" class="form-control" name="new_password2">
|
||||
<input type="password" class="form-control" name="password2_new">
|
||||
</div>
|
||||
<button type="submit" class="btn btn-default">Submit</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">Email</div>
|
||||
<div class="panel-body">
|
||||
<form method="post" action="/settings/update/email">
|
||||
{{ csrf_field() }}
|
||||
{{ method_field('PATCH') }}
|
||||
<div class="form-group">
|
||||
<h4>Change Email</h4>
|
||||
<label>Email</label>
|
||||
|
|
|
@ -18,8 +18,12 @@ Auth::routes();
|
|||
Route::get('/home', 'HomeController@index');
|
||||
Route::get('/stats', 'HomeController@stats');
|
||||
Route::get('/settings', 'HomeController@settings');
|
||||
Route::patch('/settings/update', 'HomeController@updateSettings');
|
||||
Route::patch('/settings/update/email', 'HomeController@updateEmail');
|
||||
Route::patch('/settings/update/password', 'HomeController@updatePassword');
|
||||
|
||||
Route::get('/test/question/iscorrect', 'TestController@isCorrect');
|
||||
Route::get('/test/question/hasfailed', 'TestController@hasFailed');
|
||||
Route::get('/test/question/lastquestion', 'TestController@lastQuestion');
|
||||
Route::get('/test/question', 'TestController@showQuestion');
|
||||
Route::post('/test/question', 'TestController@answerQuestion');
|
||||
Route::get('/test/answer', 'TestController@showAnswer');
|
||||
|
@ -46,7 +50,5 @@ Route::delete('/admin/questions/{question}/', 'AdminController@deleteQuestion');
|
|||
Route::get('/admin/users', 'AdminController@showUser');
|
||||
Route::get('/admin/users/new', 'AdminController@user');
|
||||
Route::post('/admin/users/new', 'AdminController@addUser');
|
||||
Route::get('/admin/users/{user}/edit', 'AdminController@editUser');
|
||||
Route::patch('/admin/users/{user}', 'AdminController@updateUser');
|
||||
Route::get('/admin/users/{user}/delete', 'AdminController@delUser');
|
||||
Route::delete('/admin/users/{user}', 'AdminController@deleteUser');
|
||||
|
|
Reference in a new issue