from flask import Blueprint, request, jsonify from flask_jwt_extended import jwt_required from flasgger.utils import swag_from from models.record import Record, db from utils import logged_user_id, format_date from datetime import datetime record_bp = Blueprint('record', __name__, url_prefix='/records') @record_bp.route('/', methods=['POST']) @jwt_required() @swag_from('../docs/records/create.yml') def create_record(): data = request.get_json() # Validate required fields required_fields = ['user_id', 'camera_id', 'space_id', 'schedule_id', 'shift_id', 'service_instance_id', 'image_path'] for field in required_fields: if field not in data: return jsonify({'error': f'Missing required field: {field}'}), 400 # Create new record record = Record( user_id=data['user_id'], camera_id=data['camera_id'], space_id=data['space_id'], schedule_id=data['schedule_id'], shift_id=data['shift_id'], service_instance_id=data['service_instance_id'], image_path=data['image_path'], record_count=data.get('record_count', 0) ) db.session.add(record) db.session.commit() return jsonify({'message': 'Record created successfully', 'record': record.to_dict()}), 201 @record_bp.route('/', methods=['GET']) @jwt_required() @swag_from('../docs/records/list.yml') def list_records(): # Get query parameters for filtering user_id = request.args.get('user_id', type=int) camera_id = request.args.get('camera_id', type=int) space_id = request.args.get('space_id', type=int) shift_id = request.args.get('shift_id', type=int) start_date = request.args.get('start_date') end_date = request.args.get('end_date') # Build query query = Record.query.filter(Record.deleted_at.is_(None)) if user_id: query = query.filter(Record.user_id == user_id) if camera_id: query = query.filter(Record.camera_id == camera_id) if space_id: query = query.filter(Record.space_id == space_id) if shift_id: query = query.filter(Record.shift_id == shift_id) if start_date: query = query.filter(Record.created_at >= datetime.strptime(start_date, '%Y-%m-%d')) if end_date: query = query.filter(Record.created_at <= datetime.strptime(end_date, '%Y-%m-%d')) records = query.all() return jsonify([record.to_dict() for record in records]), 200 @record_bp.route('/', methods=['GET']) @jwt_required() @swag_from('../docs/records/get.yml') def get_record(record_id): record = Record.query.get_or_404(record_id) return jsonify(record.to_dict()), 200 @record_bp.route('/', methods=['PUT']) @jwt_required() @swag_from('../docs/records/update.yml') def update_record(record_id): record = Record.query.get_or_404(record_id) data = request.get_json() # Update fields if provided if 'image_path' in data: record.image_path = data['image_path'] if 'record_count' in data: record.record_count = data['record_count'] record.updated_at = datetime.now() db.session.commit() return jsonify({'message': 'Record updated successfully', 'record': record.to_dict()}), 200 @record_bp.route('/', methods=['DELETE']) @jwt_required() @swag_from('../docs/records/delete.yml') def delete_record(record_id): record = Record.query.get_or_404(record_id) record.deleted_at = datetime.now() db.session.commit() return jsonify({'message': 'Record deleted successfully'}), 200 @record_bp.route('/statistics', methods=['GET']) @jwt_required() @swag_from('../docs/records/statistics.yml') def get_statistics(): # Get query parameters user_id = request.args.get('user_id', type=int) start_date = request.args.get('start_date') end_date = request.args.get('end_date') # Build base query query = Record.query.filter(Record.deleted_at.is_(None)) if user_id: query = query.filter(Record.user_id == user_id) if start_date: query = query.filter(Record.created_at >= datetime.strptime(start_date, '%Y-%m-%d')) if end_date: query = query.filter(Record.created_at <= datetime.strptime(end_date, '%Y-%m-%d')) # Calculate statistics total_records = query.count() total_count = db.session.query(db.func.sum(Record.record_count)).scalar() or 0 statistics = { 'total_records': total_records, 'total_count': total_count, 'average_count_per_record': round(total_count / total_records if total_records > 0 else 0, 2) } return jsonify(statistics), 200