did some more refactoring and add more test taking functionality

This commit is contained in:
mwalbeck 2016-09-10 15:17:31 +02:00
parent 58551fc668
commit 7987e74a6e
15 changed files with 225 additions and 153 deletions

View file

@ -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;

View file

@ -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');
}
}

View file

@ -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');
}
}

View file

@ -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;
}
}
}

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -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();
});
}

View file

@ -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();
});
}

View file

@ -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

View file

@ -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">

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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');