From 15233715b99ebd1ad3276a2d40e8cdc0054d6b54 Mon Sep 17 00:00:00 2001 From: Vincent Vanwaelscappel Date: Wed, 14 Oct 2020 13:55:21 +0200 Subject: [PATCH] wait #3947 @2.5 --- .../Admin/Operations/LogOperation.php | 2 +- .../Admin/Operations/ReportOperation.php | 68 ++++++++++++++++++- app/SubForms/Question.php | 4 ++ composer.lock | 54 +++++++-------- resources/quiz/js/main.js | 34 ++++++---- 5 files changed, 117 insertions(+), 45 deletions(-) diff --git a/app/Http/Controllers/Admin/Operations/LogOperation.php b/app/Http/Controllers/Admin/Operations/LogOperation.php index 64735b18f..f3d727e3c 100644 --- a/app/Http/Controllers/Admin/Operations/LogOperation.php +++ b/app/Http/Controllers/Admin/Operations/LogOperation.php @@ -23,7 +23,7 @@ trait LogOperation $log = new QuizAttempt(); $log->quiz = $id; $log->score = $request->get('score'); - $log->passed = $request->get('passed')?'1':'0'; + $log->passed = $request->get('passed') !== 'false' ? '1' : '0'; $log->answers = json_encode($request->get('questions')); $log->save(); diff --git a/app/Http/Controllers/Admin/Operations/ReportOperation.php b/app/Http/Controllers/Admin/Operations/ReportOperation.php index e7c67243e..c00859a7d 100644 --- a/app/Http/Controllers/Admin/Operations/ReportOperation.php +++ b/app/Http/Controllers/Admin/Operations/ReportOperation.php @@ -2,6 +2,8 @@ namespace App\Http\Controllers\Admin\Operations; +use App\Models\Quiz; +use App\Models\QuizAttempt; use Cubist\Util\Files\Files; use Illuminate\Support\Facades\Route; use PhpOffice\PhpSpreadsheet\Spreadsheet; @@ -21,14 +23,76 @@ trait ReportOperation protected function report($id) { + $quiz = Quiz::where('id', $id)->first()->getPageData(); + $first = ['#', 'Date', 'Score', 'Passed']; + + $emailQuestion = 0; + + foreach ($quiz->questions as $q => $question) { + $first[] = $question['report_label'] ?: $question['question']; + if ($question['type'] === 'email') { + $emailQuestion = $q; + } + } + + $attemptsList = [$first]; + $users = []; + /** @var QuizAttempt[] $attempts */ + $attempts = QuizAttempt::where('quiz', $id)->orderBy('created_at', 'ASC')->get(); + foreach ($attempts as $attempt) { + $email = null; + $data = $attempt->getPageData(); + $a = [$data->get('id'), $data->get('created_at'), $data->get('score'), $data->get('passed') ? '1' : '0']; + foreach ($data->get('answers', []) as $aid => $answer) { + if (null === $answer) { + continue; + } + $aa = $answer['anwser'] ?? $answer['answer'] ?? ''; + if ($aid == $emailQuestion + 1) { + $email = trim(mb_strtolower($aa)); + } + $a[] = is_array($aa) ? implode(', ', $aa) : $aa; + } + + if (null !== $email) { + if (!isset($users[$email])) { + $users[$email] = ['totalAttempts' => 0, 'attemptsBeforePassing' => 0, 'passed' => false, 'worstScore' => 100, 'bestScore' => 0]; + } + $users[$email]['totalAttempts']++; + $users[$email]['worstScore'] = min($users[$email]['worstScore'], $data->get('score')); + $users[$email]['bestScore'] = max($users[$email]['bestScore'], $data->get('score')); + if (!$users[$email]['passed']) { + $users[$email]['attemptsBeforePassing']++; + } + if ($data->get('passed')) { + $users[$email]['passed'] = true; + } + } + + $attemptsList[] = $a; + } + + $usersList = [['Email', 'Passed', 'Attempts before passed', 'Total attempts', 'Best score', 'Worst score']]; + foreach ($users as $email => $user) { + $usersList[] = [$email, $user['passed'] ? '1' : '0', $user['attemptsBeforePassing'], $user['totalAttempts'], $user['bestScore'], $user['worstScore']]; + } + $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet->getActiveSheet(); $sheet->setTitle('USERS'); + $sheet->fromArray($usersList); + foreach (range('A', 'Z') as $columnID) { + $sheet->getColumnDimension($columnID)->setAutoSize(true); + } + array_reverse($attemptsList); $sheet = $spreadsheet->createSheet(); - $sheet->setTitle('DATA'); - $sheet->setCellValue('A1', 'Hello World !'); + $sheet->setTitle('ATTEMPTS'); + $sheet->fromArray($attemptsList); + foreach (range('A', 'Z') as $columnID) { + $sheet->getColumnDimension($columnID)->setAutoSize(true); + } $writer = new Xlsx($spreadsheet); $tmp = Files::tempnam(); diff --git a/app/SubForms/Question.php b/app/SubForms/Question.php index 6a1fe1115..bee36a43d 100644 --- a/app/SubForms/Question.php +++ b/app/SubForms/Question.php @@ -15,6 +15,10 @@ class Question extends SubForm 'type' => 'Text', 'label' => 'Question label']); + $this->addField(['name' => 'report_label', + 'type' => 'Text', + 'label' => 'Question label in reports']); + $this->addField(['name' => 'type', 'type' => 'SelectFromArray', 'label' => 'Type', diff --git a/composer.lock b/composer.lock index b0f9440c3..bd527eb93 100644 --- a/composer.lock +++ b/composer.lock @@ -970,13 +970,13 @@ "source": { "type": "git", "url": "git://git.cubedesigners.com/cubist_cms-back.git", - "reference": "a93ca4e7089022c95cd738143fffb9cba3efe76f" + "reference": "b400e14d10f01ac02c5c16951bbb76b1682c2e36" }, "dist": { "type": "tar", - "url": "https://composer.cubedesigners.com/dist/cubist/cms-back/cubist-cms-back-dev-master-3bc9cf.tar", - "reference": "a93ca4e7089022c95cd738143fffb9cba3efe76f", - "shasum": "2ee03d406892aaae9ac63910af4c7960e48e4265" + "url": "https://composer.cubedesigners.com/dist/cubist/cms-back/cubist-cms-back-dev-master-c7b202.tar", + "reference": "b400e14d10f01ac02c5c16951bbb76b1682c2e36", + "shasum": "bf4286cc83661561acb996d042339510fe84eec6" }, "require": { "backpack/backupmanager": "^2.0", @@ -1051,7 +1051,7 @@ } ], "description": "Cubist Backpack extension", - "time": "2020-10-08T17:54:21+00:00" + "time": "2020-10-12T17:54:04+00:00" }, { "name": "cubist/cms-front", @@ -1908,23 +1908,23 @@ }, { "name": "dragonmantank/cron-expression", - "version": "v2.3.0", + "version": "v2.3.1", "source": { "type": "git", "url": "https://github.com/dragonmantank/cron-expression.git", - "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27" + "reference": "65b2d8ee1f10915efb3b55597da3404f096acba2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/72b6fbf76adb3cf5bc0db68559b33d41219aba27", - "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/65b2d8ee1f10915efb3b55597da3404f096acba2", + "reference": "65b2d8ee1f10915efb3b55597da3404f096acba2", "shasum": "" }, "require": { - "php": "^7.0" + "php": "^7.0|^8.0" }, "require-dev": { - "phpunit/phpunit": "^6.4|^7.0" + "phpunit/phpunit": "^6.4|^7.0|^8.0|^9.0" }, "type": "library", "extra": { @@ -1958,7 +1958,7 @@ "cron", "schedule" ], - "time": "2019-03-31T00:38:28+00:00" + "time": "2020-10-13T00:52:37+00:00" }, { "name": "egulias/email-validator", @@ -3646,16 +3646,16 @@ }, { "name": "nesbot/carbon", - "version": "2.41.2", + "version": "2.41.3", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "35959c93ada06469107a05df6b15b65074a960cf" + "reference": "e148788eeae9b9b7b87996520358b86faad37b52" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/35959c93ada06469107a05df6b15b65074a960cf", - "reference": "35959c93ada06469107a05df6b15b65074a960cf", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/e148788eeae9b9b7b87996520358b86faad37b52", + "reference": "e148788eeae9b9b7b87996520358b86faad37b52", "shasum": "" }, "require": { @@ -3721,7 +3721,7 @@ "datetime", "time" ], - "time": "2020-10-10T23:35:06+00:00" + "time": "2020-10-12T20:36:09+00:00" }, { "name": "nothingworks/blade-svg", @@ -7994,16 +7994,16 @@ }, { "name": "composer/composer", - "version": "1.10.13", + "version": "1.10.15", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "47c841ba3b2d3fc0b4b13282cf029ea18b66d78b" + "reference": "547c9ee73fe26c77af09a0ea16419176b1cdbd12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/47c841ba3b2d3fc0b4b13282cf029ea18b66d78b", - "reference": "47c841ba3b2d3fc0b4b13282cf029ea18b66d78b", + "url": "https://api.github.com/repos/composer/composer/zipball/547c9ee73fe26c77af09a0ea16419176b1cdbd12", + "reference": "547c9ee73fe26c77af09a0ea16419176b1cdbd12", "shasum": "" }, "require": { @@ -8070,7 +8070,7 @@ "dependency", "package" ], - "time": "2020-09-09T09:46:34+00:00" + "time": "2020-10-13T13:59:09+00:00" }, { "name": "composer/semver", @@ -8383,16 +8383,16 @@ }, { "name": "facade/ignition", - "version": "2.3.8", + "version": "2.4.1", "source": { "type": "git", "url": "https://github.com/facade/ignition.git", - "reference": "e8fed9c382cd1d02b5606688576a35619afdf82c" + "reference": "9fc6c3d3de5271a1b94cff19dce2c9295abf0ffa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/facade/ignition/zipball/e8fed9c382cd1d02b5606688576a35619afdf82c", - "reference": "e8fed9c382cd1d02b5606688576a35619afdf82c", + "url": "https://api.github.com/repos/facade/ignition/zipball/9fc6c3d3de5271a1b94cff19dce2c9295abf0ffa", + "reference": "9fc6c3d3de5271a1b94cff19dce2c9295abf0ffa", "shasum": "" }, "require": { @@ -8451,7 +8451,7 @@ "laravel", "page" ], - "time": "2020-10-01T23:01:14+00:00" + "time": "2020-10-14T08:59:59+00:00" }, { "name": "facade/ignition-contracts", diff --git a/resources/quiz/js/main.js b/resources/quiz/js/main.js index ab3b592d9..805518a95 100644 --- a/resources/quiz/js/main.js +++ b/resources/quiz/js/main.js @@ -311,22 +311,26 @@ var passed = checkScore(); if (logAttempts) { - var logdata = { - passed: passed, - score: Math.round(100 * (score / countQuestions)), - questions: logQuestions, - }; - - $.ajax('https://toolbox.fluidbook.com/quiz/' + $(data).find('id').text() + '/log', - { - method: 'POST', - data: logdata, - crossDomain: true, - } - ); + logAttempt(passed); } } + function logAttempt(passed){ + var logdata = { + passed: passed, + score: Math.round(100 * (score / countQuestions)), + questions: logQuestions, + }; + + $.ajax('https://toolbox.fluidbook.com/quiz/' + $(data).find('id').text() + '/log', + { + method: 'POST', + data: logdata, + crossDomain: true, + } + ); + } + function checkScore() { var normalizedScore = score / countQuestions; $('#results > h2').hide(); @@ -410,9 +414,9 @@ }); ok = this_score >= min_score; answers.push(a); - log.anwser = a; + log.answer = a; } else { - log.anwser = $(this).find('input').val(); + log.answer = $(this).find('input').val(); } var b = $("#correction .correction[data-i='" + qn + "'] .badge"); -- 2.39.5