Просмотр исходного кода

Made some significant changes to how the date is stored in the DB. Still working out the kinks.

Adam Day 2 лет назад
Родитель
Сommit
fcced1741e
3 измененных файлов с 70 добавлено и 13 удалено
  1. 59 9
      app.py
  2. 10 4
      templates/admin_ils_users.html
  3. 1 0
      templates/scheduled_emails.html

+ 59 - 9
app.py

@@ -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):

+ 10 - 4
templates/admin_ils_users.html

@@ -24,7 +24,7 @@
                     <th scope="col">Username</th>
                     <th scope="col">Email</th>
                     <th scope="col">Reset Date</th>
-                    <th scope="col">Reset Age</th>
+                    <th scope="col"></th>
                     <th scope="col"></th>
                 </tr>
             </thead>
@@ -33,10 +33,16 @@
                 <tr>
                     <td>{{ user.username }}</td>
                     <td>{{ user.email }}</td>
-                    <td>{{ user.reset_datetime }}</td>
-                    <td>{{ user.reset_datetime|time_since }}</td>
+                    <!-- check if user.reset_datetime is today -->
+
+                    <td>
+                        {{ user.reset_datetime }}
+                    </td>
+                    <td>
+                        {{ user.reset_datetime|time_since }}
+                    </td>
                     <td>
-                        <a href="{{ url_for('admin_ils_users_edit', id=user.id) }}" class="btn btn-primary">Edit</a>
+                        <a href="{{ url_for('admin_ils_users_edit', id=user.id) }}" class="btn btn-secondary w-100">Edit</a>
                     </td>
                 </tr>
                 {% endfor %}

+ 1 - 0
templates/scheduled_emails.html

@@ -9,6 +9,7 @@
 {% endif %}
 <div class="row">
     <div class="col">
+        <a href="{{ url_for('reset_scheduled_emails') }}" class="btn btn-warning float-end me-2">Reset Scheduled Reminders</a>
         <a href="{{ url_for('schedule') }}" class="btn btn-dark float-end me-2">Back</a>
         <h3><i class="ri-time-line"></i> Scheduled Reminders</h3>
         <p class="lead">The following are the scheduled email reminders.</p>