update
This commit is contained in:
@@ -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({}),
|
||||
|
||||
Reference in New Issue
Block a user