This commit is contained in:
2025-11-11 17:40:29 +01:00
parent 901e8166cd
commit 75a6973a49
11 changed files with 1028 additions and 21 deletions

View File

@@ -143,6 +143,77 @@ def send_test_email():
}), 500
@admin_bp.route('/api/admin/send-newsletter', methods=['POST'])
def send_newsletter():
"""
Send newsletter to all active subscribers
Request body (optional):
{
"max_articles": 10 // Optional, defaults to 10
}
"""
try:
data = request.get_json() or {}
max_articles = data.get('max_articles', 10)
# Validate max_articles
if not isinstance(max_articles, int) or max_articles < 1 or max_articles > 50:
return jsonify({
'success': False,
'error': 'max_articles must be an integer between 1 and 50'
}), 400
# Get subscriber count first
from database import subscribers_collection
subscriber_count = subscribers_collection.count_documents({'status': 'active'})
if subscriber_count == 0:
return jsonify({
'success': False,
'error': 'No active subscribers found',
'subscriber_count': 0
}), 400
# Execute sender in sender container using docker exec
try:
result = subprocess.run(
['docker', 'exec', 'munich-news-sender', 'python', 'sender_service.py', 'send', str(max_articles)],
capture_output=True,
text=True,
timeout=300 # 5 minute timeout for multiple emails
)
# Check if successful
success = result.returncode == 0
return jsonify({
'success': success,
'message': f'Newsletter {"sent successfully" if success else "failed"} to {subscriber_count} subscribers',
'subscriber_count': subscriber_count,
'max_articles': max_articles,
'output': result.stdout[-1000:] if result.stdout else '', # Last 1000 chars
'errors': result.stderr[-500:] if result.stderr else ''
}), 200 if success else 500
except FileNotFoundError:
return jsonify({
'success': False,
'error': 'Docker command not found. Make sure Docker is installed and the socket is mounted.'
}), 500
except subprocess.TimeoutExpired:
return jsonify({
'success': False,
'error': 'Newsletter sending timed out after 5 minutes'
}), 500
except Exception as e:
return jsonify({
'success': False,
'error': f'Failed to send newsletter: {str(e)}'
}), 500
@admin_bp.route('/api/admin/stats', methods=['GET'])
def get_stats():
"""Get system statistics"""
@@ -167,7 +238,7 @@ def get_stats():
},
'subscribers': {
'total': subscribers_collection.count_documents({}),
'active': subscribers_collection.count_documents({'active': True})
'active': subscribers_collection.count_documents({'status': 'active'})
},
'rss_feeds': {
'total': rss_feeds_collection.count_documents({}),