134 lines
4.7 KiB
Python
134 lines
4.7 KiB
Python
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('/<int:record_id>', 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('/<int:record_id>', 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('/<int:record_id>', 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 |