Server/server.py

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)