Compare commits
No commits in common. "master" and "development" have entirely different histories.
master
...
developmen
@ -17,7 +17,6 @@ services:
|
|||||||
- ./ref-test/app/editor/static:/usr/share/nginx/html/editor/static:ro
|
- ./ref-test/app/editor/static:/usr/share/nginx/html/editor/static:ro
|
||||||
- ./ref-test/app/quiz/static:/usr/share/nginx/html/quiz/static:ro
|
- ./ref-test/app/quiz/static:/usr/share/nginx/html/quiz/static:ro
|
||||||
- ./ref-test/app/view/static:/usr/share/nginx/html/view/static:ro
|
- ./ref-test/app/view/static:/usr/share/nginx/html/view/static:ro
|
||||||
- ./ref-test/app/analysis/static:/usr/share/nginx/html/analysis/static:ro
|
|
||||||
ports:
|
ports:
|
||||||
- 80:80
|
- 80:80
|
||||||
- 443:443
|
- 443:443
|
||||||
|
@ -45,11 +45,6 @@ server {
|
|||||||
alias /usr/share/nginx/html/view/static/;
|
alias /usr/share/nginx/html/view/static/;
|
||||||
}
|
}
|
||||||
|
|
||||||
location ^~ /admin/analysis/static/ {
|
|
||||||
include /etc/nginx/mime.types;
|
|
||||||
alias /usr/share/nginx/html/analysis/static/;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Proxy to the main app for all other requests
|
# Proxy to the main app for all other requests
|
||||||
location / {
|
location / {
|
||||||
include /etc/nginx/conf.d/proxy_headers.conf;
|
include /etc/nginx/conf.d/proxy_headers.conf;
|
||||||
|
@ -8,133 +8,105 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<h1>Analysis by {{ type[0]|upper }}{{ type[1:] }}</h1>
|
<h1>Analysis</h1>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<p class="lead">
|
<p class="lead">
|
||||||
The analysis section displays statistics for all test results as well as answers to individual questions.
|
Analysis for {{ type }} {{ subject }}.
|
||||||
Analysis reports can be generated per exam or per question dataset to identify common mistakes or patterns in answers.
|
|
||||||
</p>
|
</p>
|
||||||
<div class="input-group mb-3">
|
</div>
|
||||||
<span class="input-group-text">
|
<div class="container">
|
||||||
{% if type == 'exam' %}
|
<h3>
|
||||||
Exam Code
|
Question List
|
||||||
{% elif type == 'dataset' %}
|
</h3>
|
||||||
Dataset Name
|
<div class="container dataset-metadata">
|
||||||
{% endif %}
|
|
||||||
</span>
|
|
||||||
<span class="form-control">
|
|
||||||
{{ subject }}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="input-group mb-3">
|
|
||||||
<span class="input-group-text">Total Entries</span>
|
|
||||||
<span class="form-control">
|
|
||||||
{{ analysis.entries }}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="input-group mb-3">
|
|
||||||
<span class="input-group-text">Passed</span>
|
|
||||||
<span class="form-control">
|
|
||||||
{{ analysis.grades.merit + analysis.grades.pass }} ({{ ((analysis.grades.merit + analysis.grades.pass)*100/analysis.entries)|round(2) }} %)
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="mb-3">
|
|
||||||
<span class="badge rounded-pill progress-bar-striped bg-success">Merit: {{ analysis.grades.merit }}</span> <span class="badge rounded-pill bg-primary progress-bar-striped">Pass: {{ analysis.grades.pass }}</span> <span class="badge rounded-pill progress-bar-striped bg-danger">Fail: {{ analysis.grades.fail }}</span>
|
|
||||||
<div class="my-1 progress">
|
|
||||||
<div class="progress-bar progress-bar-striped bg-success" role="progressbar" style="width: {{ (analysis.grades.merit*100/analysis.entries)|round(2) }}%" aria-valuenow="{{ analysis.grades.merit }}" aria-valuemin="0" aria-valuemax="{{ analysis.entries }}">{{ (analysis.grades.merit*100/analysis.entries)|round(2) }} %</div>
|
|
||||||
<div class="progress-bar progress-bar-striped" role="progressbar" style="width: {{ (analysis.grades.pass*100/analysis.entries)|round(2) }}%" aria-valuenow="{{ analysis.grades.pass }}" aria-valuemin="0" aria-valuemax="{{ analysis.entries }}">{{ (analysis.grades.pass*100/analysis.entries)|round(2) }} %</div>
|
|
||||||
<div class="progress-bar progress-bar-striped bg-danger" role="progressbar" style="width: {{ (analysis.grades.fail*100/analysis.entries)|round(2) }}%" aria-valuenow="{{ analysis.grades.fail }}" aria-valuemin="0" aria-valuemax="{{ analysis.entries }}">{{ (analysis.grades.fail*100/analysis.entries)|round(2) }} %</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="input-group mb-3">
|
|
||||||
<span class="input-group-text">Mean Score</span>
|
|
||||||
<span class="form-control">
|
|
||||||
{{ analysis.scores.mean|round(2) }} %
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="input-group mb-3">
|
|
||||||
<span class="input-group-text">Standard Deviation</span>
|
|
||||||
<span class="form-control">
|
|
||||||
{% if analysis.scores.stdev %}
|
|
||||||
{{ analysis.scores.stdev|round(2) }}
|
|
||||||
{% else %}
|
|
||||||
{{ None }}
|
|
||||||
{% endif %}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="input-group mb-3">
|
|
||||||
<span class="input-group-text">Median Score</span>
|
|
||||||
<span class="form-control">
|
|
||||||
{{ analysis.scores.median|round(2) }} %
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
{% if type == 'exam' %}
|
|
||||||
<div class="input-group mb-3">
|
<div class="input-group mb-3">
|
||||||
<span class="input-group-text">Dataset Name</span>
|
<span class="input-group-text">Dataset Name</span>
|
||||||
<span class="form-control">
|
<span class="form-control">
|
||||||
{{ dataset.get_name() }}
|
{{ dataset.get_name() }}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
<div class="input-group mb-3">
|
||||||
</div>
|
<span class="input-group-text">Author</span>
|
||||||
<div class="container">
|
<span class="form-control">
|
||||||
<table id="analysis-table" class="table table-striped" style="width:100%">
|
{{ dataset.creator.get_username() }}
|
||||||
<thead>
|
</span>
|
||||||
<th data-priority="1">
|
</div>
|
||||||
Question
|
<div class="input-group mb-3">
|
||||||
</th>
|
<span class="input-group-text">Last Updated</span>
|
||||||
<th data-priority="1">
|
<span class="form-control">
|
||||||
Percent Correct
|
{{ dataset.date.strftime('%d %b %Y %H:%M') }}
|
||||||
</th>
|
</span>
|
||||||
<th data-priority="2">
|
</div>
|
||||||
Answers
|
{% if dataset.default %}
|
||||||
</th>
|
<div class="input-group mb-3">
|
||||||
<th data-priority="3">
|
<span class="input-group-text">
|
||||||
Tags
|
<input type="checkbox" aria-label="Default" class="dataset-default" checked disabled>
|
||||||
</th>
|
</span>
|
||||||
</thead>
|
<span class="form-control">
|
||||||
<tbody>
|
Default Dataset
|
||||||
{% for question in questions %}
|
</select>
|
||||||
<tr class="table-row">
|
</div>
|
||||||
<td>
|
{% endif %}
|
||||||
{{ question.q_no + 1 }}
|
</div>
|
||||||
</td>
|
<div class="container">
|
||||||
<td class="cell-percentage">
|
<table id="analysis-table" class="table table-striped" style="width:100%">
|
||||||
{{ ((analysis.answers[question.q_no][question.correct] or 0)*100/(analysis.answers[question.q_no].values())|sum())|round(2) }}
|
<thead>
|
||||||
</td>
|
<th data-priority="1">
|
||||||
<td>
|
Question
|
||||||
<table style="width:100%">
|
</th>
|
||||||
{% for option in question.options %}
|
<th data-priority="1">
|
||||||
<tr>
|
Percent Correct
|
||||||
<td style="width:50%">
|
</th>
|
||||||
{{ option[1] }}
|
<th data-priority="2">
|
||||||
</td>
|
Answers
|
||||||
<td>
|
</th>
|
||||||
{% if question.correct == option[0] %}
|
<th data-priority="3">
|
||||||
<div class="progress">
|
Tags
|
||||||
<div class="progress-bar bg-success progress-bar-striped" role="progressbar" style="width: {{ (analysis.answers[question.q_no][option[0]] or 0)*100/(analysis.answers[question.q_no].values())|sum() }}%;" aria-valuenow="{{ (analysis.answers[question.q_no][option[0]] or 0)*100/(analysis.answers[question.q_no].values())|sum() }}" aria-valuemin="0" aria-valuemax="100">{{ ((analysis.answers[question.q_no][option[0]] or 0)*100/(analysis.answers[question.q_no].values())|sum())|round(2) }}%</div>
|
</th>
|
||||||
</div>
|
</thead>
|
||||||
{% else %}
|
<tbody>
|
||||||
<div class="progress">
|
{% for question in questions %}
|
||||||
<div class="progress-bar bg-danger progress-bar-striped" role="progressbar" style="width: {{ (analysis.answers[question.q_no][option[0]] or 0)*100/(analysis.answers[question.q_no].values())|sum() }}%;" aria-valuenow="{{ (analysis.answers[question.q_no][option[0]] or 0)*100/(analysis.answers[question.q_no].values())|sum() }}" aria-valuemin="0" aria-valuemax="100">{{ ((analysis.answers[question.q_no][option[0]] or 0)*100/(analysis.answers[question.q_no].values())|sum())|round(2) }}%</div>
|
<tr class="table-row">
|
||||||
</div>
|
<td>
|
||||||
{% endif %}
|
{{ question.q_no + 1 }}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
<td class="cell-percentage">
|
||||||
{% endfor %}
|
{{ ((analysis.answers[question.q_no][question.correct] or 0)*100/(analysis.answers[question.q_no].values())|sum())|round(2) }}
|
||||||
</table>
|
</td>
|
||||||
</td>
|
<td>
|
||||||
<td>
|
<table style="width:100%">
|
||||||
<ul>
|
{% for option in question.options %}
|
||||||
{% for tag in question.tags %}
|
<tr>
|
||||||
<li>{{ tag|safe }}</li>
|
<td style="width:50%">
|
||||||
{% endfor %}
|
{{ option[1] }}
|
||||||
</ul>
|
</td>
|
||||||
</td>
|
<td>
|
||||||
</tr>
|
{% if question.correct == option[0] %}
|
||||||
{% endfor %}
|
<div class="progress">
|
||||||
</tbody>
|
<div class="progress-bar bg-success progress-bar-striped" role="progressbar" style="width: {{ (analysis.answers[question.q_no][option[0]] or 0)*100/(analysis.answers[question.q_no].values())|sum() }}%;" aria-valuenow="{{ (analysis.answers[question.q_no][option[0]] or 0)*100/(analysis.answers[question.q_no].values())|sum() }}" aria-valuemin="0" aria-valuemax="100">{{ ((analysis.answers[question.q_no][option[0]] or 0)*100/(analysis.answers[question.q_no].values())|sum())|round(2) }}%</div>
|
||||||
</table>
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<div class="progress">
|
||||||
|
<div class="progress-bar bg-danger progress-bar-striped" role="progressbar" style="width: {{ (analysis.answers[question.q_no][option[0]] or 0)*100/(analysis.answers[question.q_no].values())|sum() }}%;" aria-valuenow="{{ (analysis.answers[question.q_no][option[0]] or 0)*100/(analysis.answers[question.q_no].values())|sum() }}" aria-valuemin="0" aria-valuemax="100">{{ ((analysis.answers[question.q_no][option[0]] or 0)*100/(analysis.answers[question.q_no].values())|sum())|round(2) }}%</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<ul>
|
||||||
|
{% for tag in question.tags %}
|
||||||
|
<li>{{ tag|safe }}</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user