Skip to content

Commit 7b331ad

Browse files
feat: logic added for sending emails
1 parent a7aa4bc commit 7b331ad

9 files changed

Lines changed: 128 additions & 37 deletions

File tree

src/models.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class DashboardSettings(db.Model):
2929
# general settings
3030
timezone = db.Column(db.String(50), default="Asia/Kolkata")
3131
enable_cache = db.Column(db.Boolean, default=True)
32+
enable_alerts = db.Column(db.Boolean, default=False)
3233

3334
# page enable/disable
3435
is_cpu_info_enabled = db.Column(db.Boolean, default=True)
@@ -129,3 +130,4 @@ class EmailPassword(db.Model):
129130
def inject_settings():
130131
settings = DashboardSettings.query.first()
131132
return dict(settings=settings)
133+

src/routes/auth.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from src.scripts.email_me import send_email
66

77
from src.config import app, db
8-
from src.models import User, EmailPassword
8+
from src.models import User, EmailPassword, DashboardSettings
99

1010
auth_bp = blueprints.Blueprint('auth', __name__)
1111

@@ -211,8 +211,10 @@ def update_email_password():
211211
@app.route("/send_email", methods=["GET", "POST"])
212212
@login_required
213213
def send_email_page():
214+
dasboard_settings = DashboardSettings.query.first()
215+
if dasboard_settings:
216+
enable_alerts = dasboard_settings.enable_alerts
214217
if request.method == "POST":
215-
216218
receiver_email = request.form.get("recipient")
217219
subject = request.form.get("subject")
218220
body = request.form.get("body")
@@ -246,11 +248,15 @@ def send_email_page():
246248
attachment_path = f"/tmp/{attachment.filename}"
247249
attachment.save(attachment_path)
248250
try:
249-
send_email(receiver_email, subject, body, attachment_path)
250-
flash("Email sent successfully!", "success")
251+
respone = send_email(receiver_email, subject, body, attachment_path)
252+
if respone and respone["status"] == "success":
253+
flash(respone['message'], "success")
254+
elif respone and respone["status"] == "failed":
255+
flash(respone['message'], "danger")
256+
return redirect(url_for(respone["type"]))
251257
except Exception as e:
252258
flash(f"Failed to send email: {str(e)}", "danger")
253259

254260
return redirect(url_for('send_email_page'))
255261

256-
return render_template("send_email.html")
262+
return render_template("send_email.html", enable_alerts=enable_alerts)

src/routes/settings.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
settings_bp = blueprints.Blueprint("settings", __name__)
77

88

9+
910
@app.route('/settings/speedtest', methods=['GET', 'POST'])
11+
@login_required
1012
def speedtest_settings():
1113
settings = DashboardSettings.query.first() # Retrieve settings from DB
1214
if request.method == 'POST':
@@ -18,17 +20,20 @@ def speedtest_settings():
1820
return render_template('speedtest_settings.html', settings=settings)
1921

2022
@app.route('/settings/general', methods=['GET', 'POST'])
23+
@login_required
2124
def general_settings():
2225
settings = DashboardSettings.query.first() # Retrieve settings from DB
2326
if request.method == 'POST':
2427
settings.timezone = request.form.get('timezone')
2528
settings.enable_cache = 'enable_cache' in request.form
29+
settings.enable_alerts = 'enable_alerts' in request.form
2630
db.session.commit()
2731
flash('General settings updated successfully!', 'success')
2832
return redirect(url_for('general_settings'))
2933
return render_template('general_settings.html', settings=settings)
3034

3135
@app.route('/settings/feature-toggles', methods=['GET', 'POST'])
36+
@login_required
3237
def feature_toggles():
3338
settings = DashboardSettings.query.first() # Retrieve settings from DB
3439
if request.method == 'POST':
@@ -43,6 +48,7 @@ def feature_toggles():
4348
return render_template('feature_toggles.html', settings=settings)
4449

4550
@app.route('/settings/card-toggles', methods=['GET', 'POST'])
51+
@login_required
4652
def card_toggles():
4753
settings = DashboardSettings.query.first() # Retrieve settings from DB
4854
if request.method == 'POST':

src/scripts/email_me.py

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,42 @@
66
from email import encoders
77
from dotenv import load_dotenv
88

9+
from src.config import app
10+
from src.models import EmailPassword, DashboardSettings
911
# Load environment variables from .env file
1012
load_dotenv()
1113

1214
# Get email credentials from .env
1315
EMAIL_ADDRESS = os.getenv("EMAIL_ADDRESS")
1416
EMAIL_PASSWORD = os.getenv("EMAIL_PASSWORD")
1517

18+
1619
def send_email(receiver_email, subject, body, attachment_path=None):
20+
1721
if isinstance(receiver_email, str):
1822
receiver_email = [receiver_email] # Convert single address to list
1923

24+
with app.app_context():
25+
dasboard_settings = DashboardSettings.query.first()
26+
if dasboard_settings:
27+
enable_alerts = dasboard_settings.enable_alerts
28+
if not enable_alerts:
29+
print("Email alerts are disabled. Please enable them in the settings.")
30+
return {
31+
"message": "Email alerts are disabled. Please enable them in the settings.",
32+
"status": "failed",
33+
"type": "general_settings",
34+
}
35+
email_password = EmailPassword.query.first()
36+
if not email_password:
37+
print("Email credentials not found. Please set EMAIL_ADDRESS and EMAIL_PASSWORD environment variables.")
38+
return {
39+
"message": "Email credentials not found. Please set EMAIL_ADDRESS and EMAIL_PASSWORD environment variables.",
40+
"status": "failed",
41+
"type": "update_email_password",
42+
}
43+
44+
2045
for email in receiver_email:
2146
try:
2247
# Create a multipart message
@@ -54,8 +79,14 @@ def send_email(receiver_email, subject, body, attachment_path=None):
5479
text = msg.as_string()
5580
server.sendmail(EMAIL_ADDRESS, email, text)
5681

57-
print(f"Email sent successfully to {email}")
82+
return {
83+
"message": f"Email sent successfully to {email}",
84+
"status": "success",
85+
}
5886

5987
except Exception as e:
60-
print(f"Failed to send email to {email}. Error: {str(e)}")
88+
return {
89+
"message": f"failed to send email to {email}. Error: {str(e)}",
90+
"status": "failed",
91+
}
6192

src/static/css/send_email.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
border-radius: 12px;
77
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.1);
88
border: 1px solid #e0e0e0;
9+
margin-top: 50px;
910
}
1011

1112
h2 {

src/static/css/update_email_password.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
background-color: #f8f9fa;
66
border-radius: 8px;
77
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
8+
margin-top: 50px;
89
}
910

1011
h2 {

src/templates/general_settings.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ <h1 class="settings-title">General Settings</h1>
2323
<label for="enable_cache">Enable Caching:</label>
2424
<input type="checkbox" id="enable_cache" name="enable_cache" {% if settings.enable_cache %}checked{% endif %}>
2525
</div>
26+
<div class="form-group">
27+
<label for="enable_alerts">Enable Alerts:</label>
28+
<input type="checkbox" id="enable_alerts" name="enable_alerts" {% if settings.enable_alerts %}checked{% endif %}>
29+
</div>
2630

2731
<button type="submit" class="btn btn-primary">Save Settings</button>
2832
</form>

src/templates/send_email.html

Lines changed: 69 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8,36 +8,75 @@
88
<div class="email-container">
99
<h2><i class="fas fa-envelope"></i> Send Email</h2>
1010
{% include 'ext/message.html' %}
11-
<form method="POST" enctype="multipart/form-data">
12-
<div class="form-group">
13-
<label for="subject">Subject:</label>
14-
<input type="text" id="subject" name="subject" placeholder="Enter the email subject" required>
11+
12+
{% if not enable_alerts %}
13+
<div class="alert alert-info">
14+
<i class="fas fa-info-circle"></i> Alerts are currently disabled.
1515
</div>
16-
<div class="form-group">
17-
<label for="body">Body:</label>
18-
<textarea id="body" name="body" rows="6" placeholder="Write your message here" required></textarea>
19-
</div>
20-
<div class="form-group">
21-
<label for="attachment">Attachment:</label>
22-
<input type="file" id="attachment" name="attachment">
23-
</div>
24-
<div class="form-group">
25-
<label for="recipient">Recipient:</label>
26-
<select id="recipient" name="recipient" required>
27-
<option value="admin">Admin</option>
28-
<option value="all_users">All Users</option>
29-
</select>
30-
</div>
31-
<div class="form-group">
32-
<label for="priority">Priority:</label>
33-
<select id="priority" name="priority" required>
34-
<option value="low">Low</option>
35-
<option value="high">High</option>
36-
</select>
37-
</div>
38-
<button type="submit" class="btn btn-primary">
39-
<i class="fas fa-paper-plane"></i> Send Email
40-
</button>
41-
</form>
16+
<form method="POST" enctype="multipart/form-data" style="pointer-events: none; opacity: 0.5;">
17+
<div class="form-group">
18+
<label for="subject">Subject:</label>
19+
<input type="text" id="subject" name="subject" placeholder="Enter the email subject" required>
20+
</div>
21+
<div class="form-group">
22+
<label for="body">Body:</label>
23+
<textarea id="body" name="body" rows="6" placeholder="Write your message here" required></textarea>
24+
</div>
25+
<div class="form-group">
26+
<label for="attachment">Attachment:</label>
27+
<input type="file" id="attachment" name="attachment">
28+
</div>
29+
<div class="form-group">
30+
<label for="recipient">Recipient:</label>
31+
<select id="recipient" name="recipient" required>
32+
<option value="admin">Admin</option>
33+
<option value="all_users">All Users</option>
34+
</select>
35+
</div>
36+
<div class="form-group">
37+
<label for="priority">Priority:</label>
38+
<select id="priority" name="priority" required>
39+
<option value="low">Low</option>
40+
<option value="high">High</option>
41+
</select>
42+
</div>
43+
<button type="submit" class="btn btn-primary">
44+
<i class="fas fa-paper-plane"></i> Send Email
45+
</button>
46+
</form>
47+
{% else %}
48+
<form method="POST" enctype="multipart/form-data">
49+
<div class="form-group">
50+
<label for="subject">Subject:</label>
51+
<input type="text" id="subject" name="subject" placeholder="Enter the email subject" required>
52+
</div>
53+
<div class="form-group">
54+
<label for="body">Body:</label>
55+
<textarea id="body" name="body" rows="6" placeholder="Write your message here" required></textarea>
56+
</div>
57+
<div class="form-group">
58+
<label for="attachment">Attachment:</label>
59+
<input type="file" id="attachment" name="attachment">
60+
</div>
61+
<div class="form-group">
62+
<label for="recipient">Recipient:</label>
63+
<select id="recipient" name="recipient" required>
64+
<option value="admin">Admin</option>
65+
<option value="all_users">All Users</option>
66+
</select>
67+
</div>
68+
<div class="form-group">
69+
<label for="priority">Priority:</label>
70+
<select id="priority" name="priority" required>
71+
<option value="low">Low</option>
72+
<option value="high">High</option>
73+
</select>
74+
</div>
75+
<button type="submit" class="btn btn-primary">
76+
<i class="fas fa-paper-plane"></i> Send Email
77+
</button>
78+
</form>
79+
{% endif %}
4280
</div>
4381
{% endblock %}
82+

src/templates/update_email_password.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
{% block content %}
77
<div class="update-container">
88
<h2>Update Email & Password for sending alerts</h2>
9+
{% include 'ext/message.html' %}
910
<form method="post">
1011
<div class="form-group">
1112
<label for="email">Email:</label>

0 commit comments

Comments
 (0)