Compare commits
2 Commits
02a1129390
...
v0.5.2
Author | SHA1 | Date | |
---|---|---|---|
f05568b0de | |||
358695977f |
@ -1,6 +1,6 @@
|
|||||||
<nav class="navbar fixed-top navbar-expand-md navbar-dark bg-dark">
|
<nav class="navbar fixed-top navbar-expand-md navbar-dark bg-dark">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<a href="{{ url_for('admin._home') }}" class="navbar-brand mb-0 h1">RefTest | Admin</a>
|
<a href="{{ url_for('admin._home') }}" class="navbar-brand mb-0 h1">RefTest (Beta) | Admin</a>
|
||||||
<button
|
<button
|
||||||
class="navbar-toggler"
|
class="navbar-toggler"
|
||||||
type="button"
|
type="button"
|
||||||
|
@ -37,7 +37,7 @@ class Config(object):
|
|||||||
MYSQL_USER = os.getenv('MYSQL_USER')
|
MYSQL_USER = os.getenv('MYSQL_USER')
|
||||||
MYSQL_PASSWORD = os.getenv('MYSQL_PASSWORD')
|
MYSQL_PASSWORD = os.getenv('MYSQL_PASSWORD')
|
||||||
SQLALCHEMY_DATABASE_URI = f'mysql+pymysql://{MYSQL_USER}:{MYSQL_PASSWORD}@{DATABASE_HOST}:{DATABASE_PORT}/{MYSQL_DATABASE}'
|
SQLALCHEMY_DATABASE_URI = f'mysql+pymysql://{MYSQL_USER}:{MYSQL_PASSWORD}@{DATABASE_HOST}:{DATABASE_PORT}/{MYSQL_DATABASE}'
|
||||||
else: SQLALCHEMY_DATABASE_URI = f'sqlite:///{Path(os.path.abspath(f"{DATA}/db.sqlite"))}'
|
else: SQLALCHEMY_DATABASE_URI = f'sqlite:///{Path(os.path.abspath(f"{DATA}/database.db"))}'
|
||||||
|
|
||||||
class Production(Config):
|
class Production(Config):
|
||||||
pass
|
pass
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<nav class="navbar fixed-top navbar-expand-md navbar-dark bg-dark">
|
<nav class="navbar fixed-top navbar-expand-md navbar-dark bg-dark">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<a href="{{ url_for('admin._home') }}" class="navbar-brand mb-0 h1">RefTest | Admin</a>
|
<a href="{{ url_for('admin._home') }}" class="navbar-brand mb-0 h1">RefTest (Beta) | Admin</a>
|
||||||
<button
|
<button
|
||||||
class="navbar-toggler"
|
class="navbar-toggler"
|
||||||
type="button"
|
type="button"
|
||||||
|
@ -14,7 +14,8 @@ from pathlib import Path
|
|||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
|
|
||||||
class Dataset(db.Model):
|
class Dataset(db.Model):
|
||||||
id = db.Column(db.String(36), index=True, primary_key=True)
|
|
||||||
|
id = db.Column(db.String(36), primary_key=True)
|
||||||
name = db.Column(db.String(128), nullable=False)
|
name = db.Column(db.String(128), nullable=False)
|
||||||
tests = db.relationship('Test', backref='dataset')
|
tests = db.relationship('Test', backref='dataset')
|
||||||
creator_id = db.Column(db.String(36), db.ForeignKey('user.id'))
|
creator_id = db.Column(db.String(36), db.ForeignKey('user.id'))
|
||||||
|
@ -11,15 +11,16 @@ from datetime import datetime, timedelta
|
|||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
|
|
||||||
class Entry(db.Model):
|
class Entry(db.Model):
|
||||||
id = db.Column(db.String(36), index=True, primary_key=True)
|
|
||||||
|
id = db.Column(db.String(36), primary_key=True)
|
||||||
first_name = db.Column(db.String(128), nullable=False)
|
first_name = db.Column(db.String(128), nullable=False)
|
||||||
surname = db.Column(db.String(128), nullable=False)
|
surname = db.Column(db.String(128), nullable=False)
|
||||||
email = db.Column(db.String(128), nullable=False)
|
email = db.Column(db.String(128), nullable=False)
|
||||||
club = db.Column(db.String(128), nullable=True)
|
club = db.Column(db.String(128), nullable=True)
|
||||||
test_id = db.Column(db.String(36), db.ForeignKey('test.id'))
|
test_id = db.Column(db.String(36), db.ForeignKey('test.id'))
|
||||||
user_code = db.Column(db.String(6), nullable=True)
|
user_code = db.Column(db.String(6), nullable=True)
|
||||||
start_time = db.Column(db.DateTime, index=True, nullable=True)
|
start_time = db.Column(db.DateTime, nullable=True)
|
||||||
end_time = db.Column(db.DateTime, index=True, nullable=True)
|
end_time = db.Column(db.DateTime, nullable=True)
|
||||||
status = db.Column(db.String(16), nullable=True)
|
status = db.Column(db.String(16), nullable=True)
|
||||||
valid = db.Column(db.Boolean, default=True, nullable=True)
|
valid = db.Column(db.Boolean, default=True, nullable=True)
|
||||||
answers = db.Column(MutableJson, nullable=True)
|
answers = db.Column(MutableJson, nullable=True)
|
||||||
|
@ -9,9 +9,10 @@ import secrets
|
|||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
|
|
||||||
class Test(db.Model):
|
class Test(db.Model):
|
||||||
id = db.Column(db.String(36), index=True, primary_key=True)
|
|
||||||
code = db.Column(db.String(36), index=True, nullable=False)
|
id = db.Column(db.String(36), primary_key=True)
|
||||||
start_date = db.Column(db.DateTime, index=True, nullable=True)
|
code = db.Column(db.String(36), nullable=False)
|
||||||
|
start_date = db.Column(db.DateTime, nullable=True)
|
||||||
end_date = db.Column(db.DateTime, nullable=True)
|
end_date = db.Column(db.DateTime, nullable=True)
|
||||||
time_limit = db.Column(db.Integer, nullable=True)
|
time_limit = db.Column(db.Integer, nullable=True)
|
||||||
creator_id = db.Column(db.String(36), db.ForeignKey('user.id'))
|
creator_id = db.Column(db.String(36), db.ForeignKey('user.id'))
|
||||||
|
@ -11,11 +11,11 @@ from werkzeug.security import check_password_hash, generate_password_hash
|
|||||||
import secrets
|
import secrets
|
||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
class User(UserMixin, db.Model):
|
class User(UserMixin, db.Model):
|
||||||
id = db.Column(db.String(36), index=True, primary_key=True)
|
id = db.Column(db.String(36), primary_key=True)
|
||||||
username = db.Column(db.String(128), nullable=False)
|
username = db.Column(db.String(128), nullable=False)
|
||||||
password = db.Column(db.String(128), nullable=False)
|
password = db.Column(db.String(128), nullable=False)
|
||||||
email = db.Column(db.String(128), nullable=False)
|
email = db.Column(db.String(128), nullable=False)
|
||||||
reset_token = db.Column(db.String(20), index=True, nullable=True)
|
reset_token = db.Column(db.String(20), nullable=True)
|
||||||
verification_token = db.Column(db.String(20), nullable=True)
|
verification_token = db.Column(db.String(20), nullable=True)
|
||||||
tests = db.relationship('Test', backref='creator')
|
tests = db.relationship('Test', backref='creator')
|
||||||
datasets = db.relationship('Dataset', backref='creator')
|
datasets = db.relationship('Dataset', backref='creator')
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
/>
|
/>
|
||||||
{% block style %}
|
{% block style %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
<title>{% block title %} SKA Referee Test {% endblock %}</title>
|
<title>{% block title %} SKA Referee Test Beta {% endblock %}</title>
|
||||||
{% include "quiz/components/og-meta.html" %}
|
{% include "quiz/components/og-meta.html" %}
|
||||||
</head>
|
</head>
|
||||||
<body class="bg-light">
|
<body class="bg-light">
|
||||||
@ -56,8 +56,6 @@
|
|||||||
integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13"
|
integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13"
|
||||||
crossorigin="anonymous"
|
crossorigin="anonymous"
|
||||||
></script>
|
></script>
|
||||||
<!-- jQuery UI -->
|
|
||||||
<script src="https://code.jquery.com/ui/1.13.2/jquery-ui.js"></script>
|
|
||||||
<!-- Custom js -->
|
<!-- Custom js -->
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
var csrf_token = "{{ csrf_token() }}";
|
var csrf_token = "{{ csrf_token() }}";
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<nav class="navbar fixed-top navbar-expand-md navbar-dark bg-dark" id="primary-nav">
|
<nav class="navbar fixed-top navbar-expand-md navbar-dark bg-dark" id="primary-nav">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<p class="navbar-brand mb-0 h1">SKA Refereeing Test</p>
|
<p class="navbar-brand mb-0 h1">SKA Refereeing Test (Beta)</p>
|
||||||
<div class="quiz-console w-100" style="display: none;" id="q-topbar">
|
<div class="quiz-console w-100" style="display: none;" id="q-topbar">
|
||||||
<div class="d-flex justify-content align-middle">
|
<div class="d-flex justify-content align-middle">
|
||||||
<div class="container d-flex justify-content-center">
|
<div class="container d-flex justify-content-center">
|
||||||
|
@ -1,10 +1,6 @@
|
|||||||
{% extends "quiz/components/base.html" %}
|
{% extends "quiz/components/base.html" %}
|
||||||
{% import "bootstrap/wtf.html" as wtf %}
|
{% import "bootstrap/wtf.html" as wtf %}
|
||||||
|
|
||||||
{% block style %}
|
|
||||||
<link rel="stylesheet" href="https://code.jquery.com/ui/1.13.2/themes/base/jquery-ui.css">
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="form-container">
|
<div class="form-container">
|
||||||
<form name="form-quiz-start" class="form-quiz-start">
|
<form name="form-quiz-start" class="form-quiz-start">
|
||||||
@ -48,13 +44,3 @@
|
|||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block script %}
|
|
||||||
<script>
|
|
||||||
$( function() {
|
|
||||||
const clubs = {{ clubs|tojson }}
|
|
||||||
$('#club').autocomplete({
|
|
||||||
source: clubs
|
|
||||||
})
|
|
||||||
} )
|
|
||||||
</script>
|
|
||||||
{% endblock %}
|
|
@ -29,23 +29,6 @@ def _instructions():
|
|||||||
|
|
||||||
@quiz.route('/start/', methods=['GET', 'POST'])
|
@quiz.route('/start/', methods=['GET', 'POST'])
|
||||||
def _start():
|
def _start():
|
||||||
clubs = [
|
|
||||||
'Dundee Korfball Club',
|
|
||||||
'Edinburgh City Korfball Club',
|
|
||||||
'Edinburgh Mavericks Korfball Club',
|
|
||||||
'Edinburgh University Korfball Club',
|
|
||||||
'Glasgow Korfball Club',
|
|
||||||
'Saint Andrews University Korfball Club',
|
|
||||||
'Strathclyde University Korfball Club'
|
|
||||||
]
|
|
||||||
try: entries = Entry.query.all()
|
|
||||||
except Exception as exception:
|
|
||||||
write('system.log', f'Database error when processing request \'{request.url}\': {exception}')
|
|
||||||
return abort(500)
|
|
||||||
for entry in entries: clubs.append(entry.get_club())
|
|
||||||
clubs = list(set(clubs))
|
|
||||||
try: clubs.remove('')
|
|
||||||
except: pass
|
|
||||||
form = StartQuiz()
|
form = StartQuiz()
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
if form.validate_on_submit():
|
if form.validate_on_submit():
|
||||||
@ -75,7 +58,7 @@ def _start():
|
|||||||
}), 200
|
}), 200
|
||||||
return jsonify({'error': 'There was an error processing the user test and/or user codes.'}), 400
|
return jsonify({'error': 'There was an error processing the user test and/or user codes.'}), 400
|
||||||
return send_errors_to_client(form=form)
|
return send_errors_to_client(form=form)
|
||||||
return render_template('/quiz/start_quiz.html', form = form, clubs = clubs)
|
return render_template('/quiz/start_quiz.html', form = form)
|
||||||
|
|
||||||
@quiz.route('/quiz/')
|
@quiz.route('/quiz/')
|
||||||
def _quiz():
|
def _quiz():
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<link rel="shortcut icon" href="{{ url_for('views.static', filename='favicon.ico') }}">
|
<link rel="shortcut icon" href="{{ url_for('views.static', filename='favicon.ico') }}">
|
||||||
{% block style %}
|
{% block style %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
<title>{% block title %} SKA Referee Test {% endblock %}</title>
|
<title>{% block title %} SKA Referee Test Beta {% endblock %}</title>
|
||||||
</head>
|
</head>
|
||||||
<body class="bg-light">
|
<body class="bg-light">
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
/>
|
/>
|
||||||
{% block style %}
|
{% block style %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
<title>{% block title %} SKA Referee Test {% endblock %}</title>
|
<title>{% block title %} SKA Referee Test Beta {% endblock %}</title>
|
||||||
{% include "components/og-meta.html" %}
|
{% include "components/og-meta.html" %}
|
||||||
</head>
|
</head>
|
||||||
<body class="bg-light">
|
<body class="bg-light">
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<nav class="navbar fixed-top navbar-expand-md navbar-dark bg-dark" id="primary-nav">
|
<nav class="navbar fixed-top navbar-expand-md navbar-dark bg-dark" id="primary-nav">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<p class="navbar-brand mb-0 h1">SKA Refereeing Test</p>
|
<p class="navbar-brand mb-0 h1">SKA Refereeing Test (Beta)</p>
|
||||||
<div class="quiz-console w-100" style="display: none;" id="q-topbar">
|
<div class="quiz-console w-100" style="display: none;" id="q-topbar">
|
||||||
<div class="d-flex justify-content align-middle">
|
<div class="d-flex justify-content align-middle">
|
||||||
<div class="container d-flex justify-content-center">
|
<div class="container d-flex justify-content-center">
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
from .data import load
|
||||||
from ..models import User
|
from ..models import User
|
||||||
from ..tools.logs import write
|
from ..tools.logs import write
|
||||||
|
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
|
||||||
|
from ..extensions import db
|
||||||
from ..tools.logs import write
|
from ..tools.logs import write
|
||||||
|
|
||||||
from flask import jsonify
|
from flask import jsonify
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<nav class="navbar fixed-top navbar-expand-md navbar-dark bg-dark">
|
<nav class="navbar fixed-top navbar-expand-md navbar-dark bg-dark">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<a href="{{ url_for('admin._home') }}" class="navbar-brand mb-0 h1">RefTest | Admin</a>
|
<a href="{{ url_for('admin._home') }}" class="navbar-brand mb-0 h1">RefTest (Beta) | Admin</a>
|
||||||
<button
|
<button
|
||||||
class="navbar-toggler"
|
class="navbar-toggler"
|
||||||
type="button"
|
type="button"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
blinker==1.5
|
blinker==1.5
|
||||||
cffi==1.15.1
|
cffi==1.15.1
|
||||||
click==8.1.3
|
click==8.1.3
|
||||||
cryptography==38.0.1
|
cryptography==37.0.4
|
||||||
dnspython==2.2.1
|
dnspython==2.2.1
|
||||||
dominate==2.7.0
|
dominate==2.7.0
|
||||||
email-validator==1.2.1
|
email-validator==1.2.1
|
||||||
@ -11,22 +11,19 @@ Flask-Login==0.6.2
|
|||||||
Flask-Mail==0.9.1
|
Flask-Mail==0.9.1
|
||||||
Flask-SQLAlchemy==2.5.1
|
Flask-SQLAlchemy==2.5.1
|
||||||
Flask-WTF==1.0.1
|
Flask-WTF==1.0.1
|
||||||
greenlet==1.1.3
|
greenlet==1.1.2
|
||||||
gunicorn==20.1.0
|
gunicorn==20.1.0
|
||||||
idna==3.3
|
idna==3.3
|
||||||
itsdangerous==2.1.2
|
itsdangerous==2.1.2
|
||||||
Jinja2==3.1.2
|
Jinja2==3.1.2
|
||||||
MarkupSafe==2.1.1
|
MarkupSafe==2.1.1
|
||||||
pip==22.2.2
|
|
||||||
pycparser==2.21
|
pycparser==2.21
|
||||||
PyMySQL==1.0.2
|
PyMySQL==1.0.2
|
||||||
python-dotenv==0.21.0
|
python-dotenv==0.20.0
|
||||||
setuptools==65.3.0
|
|
||||||
six==1.16.0
|
six==1.16.0
|
||||||
SQLAlchemy==1.4.41
|
SQLAlchemy==1.4.40
|
||||||
sqlalchemy-json==0.5.0
|
sqlalchemy-json==0.5.0
|
||||||
SQLAlchemy-Utils==0.38.3
|
SQLAlchemy-Utils==0.38.3
|
||||||
visitor==0.1.3
|
visitor==0.1.3
|
||||||
Werkzeug==2.2.2
|
Werkzeug==2.2.2
|
||||||
wheel==0.37.1
|
|
||||||
WTForms==3.0.1
|
WTForms==3.0.1
|
||||||
|
Reference in New Issue
Block a user