|
@@ -81,6 +81,12 @@ class EmailReminderLog(Model):
|
|
|
database = db
|
|
|
|
|
|
|
|
|
+def reminder_cleanup():
|
|
|
+ reminders = EmailReminderLog.select().where(EmailReminderLog.date < datetime.datetime.now().strftime('%Y-%m-%d')).execute()
|
|
|
+ for reminder in reminders:
|
|
|
+ reminder.delete_instance()
|
|
|
+
|
|
|
+
|
|
|
def scheduler(stop_event):
|
|
|
while not stop_event.is_set():
|
|
|
db.connect()
|
|
@@ -107,6 +113,9 @@ def scheduler(stop_event):
|
|
|
smtp_password_setting = Settings.get(Settings.name == 'SMTP Password')
|
|
|
smtp_password = smtp_password_setting.value
|
|
|
|
|
|
+ reset_link_setting = Settings.get(Settings.name == 'Password Reset URL')
|
|
|
+ reset_link = reset_link_setting.value
|
|
|
+
|
|
|
# Loop through each user and calculate the number of days until the users password
|
|
|
# expires based on the password_reset_interval value.
|
|
|
# Loop through all users
|
|
@@ -135,15 +144,29 @@ def scheduler(stop_event):
|
|
|
|
|
|
# Get all email reminders from the DB
|
|
|
# if today's date matches the EmailReminderLog date then send the email and mark the reminder as sent
|
|
|
- reminders = EmailReminderLog.select().where(EmailReminderLog.date == datetime.datetime.now().strftime('%Y-%m-%d'), EmailReminderLog.ignore == False).execute()
|
|
|
+ reminders = EmailReminderLog.select().where(EmailReminderLog.date == datetime.datetime.now().strftime('%Y-%m-%d'), EmailReminderLog.ignore == 0, EmailReminderLog.sent == 0).execute()
|
|
|
for reminder in reminders:
|
|
|
# Send the email
|
|
|
emailer = Emailer(smtp_host, smtp_port, smtp_username, smtp_password)
|
|
|
- emailer.send_email(reminder.email, 'Password Reset Reminder', 'Your password will expire in ' + reminder.interval + ' days. Please visit ' + domain_name + ' to reset your password.')
|
|
|
+ if reminder.interval == 1:
|
|
|
+ # 1 day reminder email
|
|
|
+ emailer.send_email(reminder.email, 'ILS Password Reset Reminder',
|
|
|
+ 'The password for ILS account with the username "'
|
|
|
+ + reminder.username + '" will expire in ' + reminder.interval +
|
|
|
+ ' day. To reset your password, please click the following link: ' + reset_link + '. If the password is not reset today the account will be locked.')
|
|
|
+ else:
|
|
|
+ # more than a day reminder email
|
|
|
+ emailer.send_email(reminder.email, 'ILS Password Reset Reminder',
|
|
|
+ 'The password for ILS account with the username "'
|
|
|
+ + reminder.username + '" will expire in ' + reminder.interval +
|
|
|
+ ' days. To reset your password, please click the following link: ' + reset_link)
|
|
|
# Mark the reminder as sent
|
|
|
reminder.sent = True
|
|
|
reminder.save()
|
|
|
db.close()
|
|
|
+
|
|
|
+ # Remove all reminders from the DB that are older than today's date
|
|
|
+ reminder_cleanup()
|
|
|
time.sleep(10) # Sleep for 15 minutes
|
|
|
|
|
|
|
|
@@ -293,7 +316,7 @@ def format_time_ago(timestamp):
|
|
|
if diff.days > 0:
|
|
|
return f"{diff.days} day{'s' if diff.days > 1 else ''} ago"
|
|
|
|
|
|
- return "Today"
|
|
|
+ return ""
|
|
|
|
|
|
|
|
|
# Create method for time until
|
|
@@ -405,8 +428,8 @@ def index():
|
|
|
|
|
|
if user:
|
|
|
# Reset login datetime
|
|
|
- user.reset_datetime = datetime.datetime.now()
|
|
|
- PasswordResetLog.create(username=user.username, date_created=datetime.datetime.now().strftime("%Y-%m-%d")).save()
|
|
|
+ user.reset_datetime = datetime.datetime.now().strftime("%Y-%m-%d")
|
|
|
+ PasswordResetLog.create(username=user.username, date_created=datetime.datetime.now()).save()
|
|
|
user.save()
|
|
|
|
|
|
# Open the reset URL in a new tab if the URL is valid
|
|
@@ -671,13 +694,11 @@ def admin_ils_users_edit(id):
|
|
|
if username in all_users:
|
|
|
message = 'Username already exists'
|
|
|
else:
|
|
|
- # Update Scheduled Email reminders
|
|
|
+ # Remove all scheduled email reminders. They will automatically be rescheduled with the new information.
|
|
|
try:
|
|
|
email_reminders = EmailReminderLog.select().where(EmailReminderLog.username == user.username).execute()
|
|
|
for reminder in email_reminders:
|
|
|
- reminder.username = username
|
|
|
- reminder.email = email
|
|
|
- reminder.save()
|
|
|
+ reminder.delete_instance()
|
|
|
except Exception as e:
|
|
|
print(e)
|
|
|
|
|
@@ -735,6 +756,16 @@ def admin_ils_users_csv_import():
|
|
|
email = row[1]
|
|
|
reset_date = row[2]
|
|
|
|
|
|
+ try:
|
|
|
+ reset_date = datetime.datetime.strptime(reset_date, '%m/%d/%Y').strftime('%Y-%m-%d')
|
|
|
+ except Exception as e:
|
|
|
+ print(e)
|
|
|
+
|
|
|
+ try:
|
|
|
+ reset_date = datetime.datetime.strptime(reset_date, '%Y-%m-%d').strftime('%Y-%m-%d')
|
|
|
+ except Exception as e:
|
|
|
+ print(e)
|
|
|
+
|
|
|
# ignore the header row
|
|
|
if username == 'ILS Username':
|
|
|
continue
|
|
@@ -825,6 +856,11 @@ def settings():
|
|
|
else:
|
|
|
value = setting.value
|
|
|
|
|
|
+ # Remove all scheduled reminders
|
|
|
+ reminders = EmailReminderLog.select().execute()
|
|
|
+ for reminder in reminders:
|
|
|
+ reminder.delete_instance()
|
|
|
+
|
|
|
# Update the setting
|
|
|
old_value = setting.value
|
|
|
setting.value = value
|
|
@@ -911,6 +947,20 @@ def scheduled_emails():
|
|
|
return render_template('scheduled_emails.html', context=context)
|
|
|
|
|
|
|
|
|
+@app.route('/admin/schedule/emails/clear')
|
|
|
+def reset_scheduled_emails():
|
|
|
+ # Check to see if user is logged in
|
|
|
+ if not requires_auth():
|
|
|
+ return redirect(url_for('login'))
|
|
|
+
|
|
|
+ # Get all future emailreminderlogs
|
|
|
+ reminders = EmailReminderLog.select().execute()
|
|
|
+ for reminder in reminders:
|
|
|
+ reminder.delete_instance()
|
|
|
+
|
|
|
+ return redirect(url_for('scheduled_emails'))
|
|
|
+
|
|
|
+
|
|
|
# remove schedule
|
|
|
@app.route('/admin/schedule/remove/reminder/<int:id>')
|
|
|
def reminder_remove(id):
|