150 lines
4.7 KiB
Python
150 lines
4.7 KiB
Python
from flask import Flask, request, jsonify, session, render_template
|
|
from pymongo import MongoClient
|
|
from datetime import datetime
|
|
import os
|
|
|
|
app = Flask(__name__)
|
|
application = app
|
|
app.secret_key = os.urandom(24)
|
|
|
|
#try:
|
|
# from local_settings import *
|
|
#except ImportError:
|
|
# print("Can't import from localsettings, terminating")
|
|
# exit()
|
|
|
|
EXPECTED_PASSWORD = "8V33zfvkImxBZcigtQ"
|
|
#APPLICATION_PASSWORD
|
|
uri = "mongodb://zpdai.rkg.lv/submit"
|
|
#MONGO_URI
|
|
TEACHER_PASSWORD = "teacher_password_123"
|
|
|
|
mongo_client = MongoClient(uri)
|
|
db = mongo_client["user_interactions"]
|
|
events_col = db["user_events"]
|
|
sessions_col = db["monitoring_sessions"]
|
|
|
|
current_session = {
|
|
'active': False,
|
|
'class_name': None,
|
|
'start_time': None,
|
|
'session_id': None
|
|
}
|
|
|
|
def validate_event(event):
|
|
required_keys = ["@version", "type", "TimeStamp", "data", "@timestamp"]
|
|
return all(key in event for key in required_keys)
|
|
|
|
@app.after_request
|
|
def add_cors_headers(response):
|
|
response.headers['Access-Control-Allow-Origin'] = '*'
|
|
response.headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
|
|
response.headers['Access-Control-Allow-Headers'] = 'Content-Type, X-Password'
|
|
return response
|
|
|
|
@app.route('/api/session_status', methods=['OPTIONS'])
|
|
@app.route('/teacher/control', methods=['OPTIONS'])
|
|
def handle_options():
|
|
return jsonify(), 200, {
|
|
'Access-Control-Allow-Origin': '*',
|
|
'Access-Control-Allow-Methods': 'POST, GET, OPTIONS',
|
|
'Access-Control-Allow-Headers': 'Content-Type'
|
|
}
|
|
|
|
@app.route('/submit', methods=['POST', 'OPTIONS'])
|
|
def submit_event():
|
|
if request.method == 'OPTIONS':
|
|
return jsonify(), 204
|
|
|
|
try:
|
|
password = request.headers.get('X-Password')
|
|
if password != EXPECTED_PASSWORD:
|
|
return jsonify({"error": "Неверный пароль"}), 403
|
|
|
|
event = request.get_json()
|
|
if not event or not validate_event(event):
|
|
return jsonify({"error": "Неверный формат"}), 400
|
|
|
|
if current_session['active']:
|
|
event['session_id'] = current_session['session_id']
|
|
events_col.insert_one(event)
|
|
return jsonify({"message": "Действие сохранено"}), 200
|
|
else:
|
|
return jsonify({"error": "Сессия не активна"}), 400
|
|
|
|
except Exception as e:
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@app.route('/api/session_status', methods=['GET', 'OPTIONS'])
|
|
def session_status():
|
|
if request.method == 'OPTIONS':
|
|
return jsonify(), 204
|
|
|
|
return jsonify({
|
|
'active': current_session['active'],
|
|
'class_name': current_session['class_name'],
|
|
'session_id': current_session['session_id']
|
|
}), 200
|
|
|
|
|
|
@app.route('/teacher', methods=['GET'])
|
|
def teacher_panel():
|
|
if not session.get('teacher_logged_in'):
|
|
return render_template('login.html')
|
|
return render_template('teacher_panel.html')
|
|
|
|
@app.route('/teacher/login', methods=['POST', 'OPTIONS'])
|
|
def teacher_login():
|
|
if request.method == 'OPTIONS':
|
|
return jsonify(), 204
|
|
|
|
password = request.json.get('password')
|
|
if password == TEACHER_PASSWORD:
|
|
session['teacher_logged_in'] = True
|
|
return jsonify({'status': 'success'}), 200
|
|
return jsonify({'error': 'Invalid password'}), 401
|
|
|
|
@app.route('/teacher/control', methods=['POST', 'OPTIONS'])
|
|
def session_control():
|
|
if request.method == 'OPTIONS':
|
|
return jsonify(), 200
|
|
|
|
if not session.get('teacher_logged_in'):
|
|
return jsonify({'error': 'Unauthorized'}), 401
|
|
|
|
action = request.json.get('action')
|
|
class_name = request.json.get('class_name')
|
|
|
|
if action == 'start' and class_name:
|
|
current_session.update({
|
|
'active': True,
|
|
'class_name': class_name,
|
|
'start_time': datetime.now(),
|
|
'session_id': os.urandom(16).hex()
|
|
})
|
|
sessions_col.insert_one({
|
|
'session_id': current_session['session_id'],
|
|
'class': class_name,
|
|
'start_time': current_session['start_time'],
|
|
'end_time': None,
|
|
'active': True
|
|
})
|
|
return jsonify({'status': 'session_started'}), 200
|
|
|
|
elif action == 'stop':
|
|
sessions_col.update_one(
|
|
{'session_id': current_session['session_id']},
|
|
{'$set': {'active': False, 'end_time': datetime.now()}}
|
|
)
|
|
current_session.update({
|
|
'active': False,
|
|
'class_name': None,
|
|
'start_time': None,
|
|
'session_id': None
|
|
})
|
|
return jsonify({'status': 'session_stopped'}), 200
|
|
|
|
return jsonify({'error': 'Invalid request'}), 400
|
|
|
|
if __name__ == '__main__':
|
|
app.run(host='0.0.0.0', port=5000) |