Dockerised. Restructured to remove circular import
Moved most of app definitions out of guard function to use wsgi Updated configuration files and referencing of .env values. Local version needs dotenv or exporting of env variables. Dockerised version works fine without load_dotenv. Ready to test now!
This commit is contained in:
@ -6,8 +6,6 @@ from uuid import uuid4
|
||||
from common.security.database import decrypt_find_one, encrypted_update
|
||||
from werkzeug.security import check_password_hash
|
||||
|
||||
from main import db
|
||||
|
||||
from .views import admin_account_required, disable_on_registration, login_required, disable_if_logged_in, get_id_from_cookie
|
||||
|
||||
auth = Blueprint(
|
||||
@ -22,6 +20,7 @@ auth = Blueprint(
|
||||
@login_required
|
||||
def account():
|
||||
from .models.forms import UpdateAccountForm
|
||||
from main import db
|
||||
form = UpdateAccountForm()
|
||||
_id = get_id_from_cookie()
|
||||
user = decrypt_find_one(db.users, {'_id': _id})
|
||||
@ -112,6 +111,7 @@ def reset():
|
||||
@admin_account_required
|
||||
@disable_if_logged_in
|
||||
def reset_gateway(token1,token2):
|
||||
from main import db
|
||||
user = decrypt_find_one( db.users, {'reset_token' : token1} )
|
||||
if not user:
|
||||
return redirect(url_for('admin_auth.login'))
|
||||
|
@ -6,10 +6,10 @@ import secrets
|
||||
import os
|
||||
from json import dump, loads
|
||||
|
||||
from main import app, db
|
||||
from common.security import encrypt
|
||||
|
||||
class Test:
|
||||
|
||||
def __init__(self, _id=None, start_date=None, expiry_date=None, time_limit=None, creator=None, dataset=None):
|
||||
self._id = _id
|
||||
self.start_date = start_date
|
||||
@ -19,6 +19,7 @@ class Test:
|
||||
self.dataset = dataset
|
||||
|
||||
def create(self):
|
||||
from main import app, db
|
||||
test = {
|
||||
'_id': self._id,
|
||||
'date_created': datetime.today(),
|
||||
@ -41,6 +42,7 @@ class Test:
|
||||
return jsonify({'error': f'Could not create exam. An error occurred.'}), 400
|
||||
|
||||
def add_time_adjustment(self, time_adjustment):
|
||||
from main import db
|
||||
user_code = secrets.token_hex(3).upper()
|
||||
adjustment = {
|
||||
user_code: time_adjustment
|
||||
@ -51,6 +53,7 @@ class Test:
|
||||
return jsonify({'error': 'Failed to add the time adjustment. An error occurred.'}), 400
|
||||
|
||||
def remove_time_adjustment(self, user_code):
|
||||
from main import db
|
||||
if db.tests.find_one_and_update({'_id': self._id}, {'$unset': {f'time_adjustments.{user_code}': {}}}):
|
||||
message = 'Time adjustment has been deleted.'
|
||||
flash(message, 'success')
|
||||
@ -64,6 +67,7 @@ class Test:
|
||||
return test_code.replace('—', '')
|
||||
|
||||
def delete(self):
|
||||
from main import app, db
|
||||
test = db.tests.find_one({'_id': self._id})
|
||||
if 'entries' in test:
|
||||
if test['entries']:
|
||||
@ -83,6 +87,7 @@ class Test:
|
||||
return jsonify({'error': f'Could not create exam. An error occurred.'}), 400
|
||||
|
||||
def update(self):
|
||||
from main import db
|
||||
test = {}
|
||||
updated = []
|
||||
if not self.start_date == '' and self.start_date is not None:
|
||||
|
@ -10,10 +10,8 @@ from werkzeug.security import check_password_hash
|
||||
from common.security.database import decrypt_find, decrypt_find_one
|
||||
from .models.users import User
|
||||
from flask_mail import Message
|
||||
from main import app, db
|
||||
from uuid import uuid4
|
||||
import secrets
|
||||
from main import mail
|
||||
from datetime import datetime, date
|
||||
from .models.tests import Test
|
||||
from common.data_tools import get_default_dataset, get_time_options, available_datasets, get_datasets
|
||||
@ -28,6 +26,8 @@ views = Blueprint(
|
||||
def admin_account_required(function):
|
||||
@wraps(function)
|
||||
def decorated_function(*args, **kwargs):
|
||||
from main import db
|
||||
from main import db
|
||||
if not db.users.find_one({}):
|
||||
flash('No administrator accounts have been registered. Please register an administrator account.', 'alert')
|
||||
return redirect(url_for('admin_auth.register'))
|
||||
@ -37,6 +37,7 @@ def admin_account_required(function):
|
||||
def disable_on_registration(function):
|
||||
@wraps(function)
|
||||
def decorated_function(*args, **kwargs):
|
||||
from main import db
|
||||
if db.users.find_one({}):
|
||||
return abort(404)
|
||||
return function(*args, **kwargs)
|
||||
@ -46,6 +47,7 @@ def get_id_from_cookie():
|
||||
return request.cookies.get('_id')
|
||||
|
||||
def get_user_from_db(_id):
|
||||
from main import db
|
||||
return db.users.find_one({'_id': _id})
|
||||
|
||||
def check_login():
|
||||
@ -76,6 +78,7 @@ def disable_if_logged_in(function):
|
||||
@admin_account_required
|
||||
@login_required
|
||||
def home():
|
||||
from main import db
|
||||
tests = db.tests.find()
|
||||
results = decrypt_find(db.entries, {})
|
||||
current_tests = [ test for test in tests if test['expiry_date'].date() >= date.today() and test['start_date'].date() <= date.today() ]
|
||||
@ -92,6 +95,7 @@ def home():
|
||||
@admin_account_required
|
||||
@login_required
|
||||
def settings():
|
||||
from main import db
|
||||
users = decrypt_find(db.users, {})
|
||||
users.sort(key= lambda x: x['username'])
|
||||
datasets = get_datasets()
|
||||
@ -101,6 +105,7 @@ def settings():
|
||||
@admin_account_required
|
||||
@login_required
|
||||
def users():
|
||||
from main import db, mail
|
||||
from .models.forms import CreateUserForm
|
||||
form = CreateUserForm()
|
||||
if request.method == 'GET':
|
||||
@ -148,6 +153,7 @@ def users():
|
||||
@admin_account_required
|
||||
@login_required
|
||||
def delete_user(_id:str):
|
||||
from main import db, mail
|
||||
if _id == get_id_from_cookie():
|
||||
flash('Cannot delete your own user account.', 'error')
|
||||
return redirect(url_for('admin_views.users'))
|
||||
@ -197,6 +203,7 @@ def delete_user(_id:str):
|
||||
@admin_account_required
|
||||
@login_required
|
||||
def update_user(_id:str):
|
||||
from main import db, mail
|
||||
if _id == get_id_from_cookie():
|
||||
flash('Cannot delete your own user account.', 'error')
|
||||
return redirect(url_for('admin_views.users'))
|
||||
@ -279,6 +286,7 @@ def questions():
|
||||
@admin_account_required
|
||||
@login_required
|
||||
def delete_questions():
|
||||
from main import db, app
|
||||
filename = request.get_json()['filename']
|
||||
data_files = glob(os.path.join(app.config["DATA_FILE_DIRECTORY"],'*.json'))
|
||||
if any(filename in file for file in data_files):
|
||||
@ -301,6 +309,7 @@ def delete_questions():
|
||||
@admin_account_required
|
||||
@login_required
|
||||
def make_default_questions():
|
||||
from main import app
|
||||
filename = request.get_json()['filename']
|
||||
data_files = glob(os.path.join(app.config["DATA_FILE_DIRECTORY"],'*.json'))
|
||||
default_file_path = os.path.join(app.config['DATA_FILE_DIRECTORY'], '.default.txt')
|
||||
@ -320,6 +329,7 @@ def make_default_questions():
|
||||
@admin_account_required
|
||||
@login_required
|
||||
def tests(filter=''):
|
||||
from main import db
|
||||
if not available_datasets():
|
||||
flash('There are no available question datasets. Please upload a question dataset in order to set up an exam.', 'error')
|
||||
return redirect(url_for('admin_views.questions'))
|
||||
@ -359,6 +369,7 @@ def tests(filter=''):
|
||||
@admin_account_required
|
||||
@login_required
|
||||
def create_test():
|
||||
from main import db
|
||||
from .models.forms import CreateTest
|
||||
form = CreateTest()
|
||||
form.dataset.choices = available_datasets()
|
||||
@ -398,6 +409,7 @@ def create_test():
|
||||
@admin_account_required
|
||||
@login_required
|
||||
def delete_test():
|
||||
from main import db
|
||||
_id = request.get_json()['_id']
|
||||
if db.tests.find_one({'_id': _id}):
|
||||
return Test(_id = _id).delete()
|
||||
@ -407,6 +419,7 @@ def delete_test():
|
||||
@admin_account_required
|
||||
@login_required
|
||||
def view_test(_id):
|
||||
from main import db
|
||||
from .models.forms import AddTimeAdjustment
|
||||
form = AddTimeAdjustment()
|
||||
test = decrypt_find_one(db.tests, {'_id': _id})
|
||||
@ -431,6 +444,7 @@ def delete_adjustment(_id):
|
||||
@admin_account_required
|
||||
@login_required
|
||||
def view_entries():
|
||||
from main import db
|
||||
entries = decrypt_find(db.entries, {})
|
||||
return render_template('/admin/results.html', entries = entries)
|
||||
|
||||
@ -438,6 +452,7 @@ def view_entries():
|
||||
@admin_account_required
|
||||
@login_required
|
||||
def view_entry(_id=''):
|
||||
from main import db
|
||||
entry = decrypt_find_one(db.entries, {'_id': _id})
|
||||
if request.method == 'GET':
|
||||
if not entry:
|
||||
@ -468,6 +483,7 @@ def view_entry(_id=''):
|
||||
@admin_account_required
|
||||
@login_required
|
||||
def generate_certificate():
|
||||
from main import db
|
||||
_id = request.get_json()['_id']
|
||||
entry = decrypt_find_one(db.entries, {'_id': _id})
|
||||
if not entry:
|
||||
|
Reference in New Issue
Block a user