1
0
Эх сурвалжийг харах

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

Adam Day 2 жил өмнө
parent
commit
2b1f204c88

+ 40 - 38
app.py

@@ -31,7 +31,7 @@ class User(Model):
 class IlsUser(Model):
     username = CharField()
     email = CharField()
-    reset_datetime = DateTimeField(default=datetime.datetime.now)
+    reset_datetime = CharField()
 
     class Meta:
         database = db
@@ -62,7 +62,7 @@ class Log(Model):
 
 
 class PasswordResetLog(Model):
-    date = DateTimeField(default=datetime.datetime.now)
+    date = CharField(default=datetime.datetime.now().strftime('%Y-%m-%d'))
     username = CharField()
 
     class Meta:
@@ -121,7 +121,7 @@ def scheduler(stop_event):
                 # then the password will expire on 2019-04-01.  If the interval is 30 days then the
                 # email should be sent on 2019-03-02.
                 # Calculate the date that the password will expire
-                password_expiration_date = user.reset_datetime + datetime.timedelta(days=int(password_reset_interval))
+                password_expiration_date = datetime.datetime.strptime(user.reset_datetime, "%Y-%m-%d") + datetime.timedelta(days=int(password_reset_interval))
                 # Subtract the interval from the password expiration date to get the date that the email should be sent
                 email_date = password_expiration_date - datetime.timedelta(days=int(interval.interval))
 
@@ -273,13 +273,14 @@ scheduler_thread.start()
 
 # Start the HTTP Server
 app = Flask(__name__)
-app.secret_key = os.urandom(24)
+#app.secret_key = os.urandom(24)
+app.secret_key = "DEVELOPMENT"
 
 
 def format_time_ago(timestamp):
     """Calculate the time passed since a datetime stamp and format it as a human-readable string."""
     now = datetime.datetime.now()
-    diff = now - timestamp
+    diff = now - datetime.datetime.strptime(timestamp, "%Y-%m-%d")
 
     if diff.days > 365:
         years = diff.days // 365
@@ -292,22 +293,14 @@ def format_time_ago(timestamp):
     if diff.days > 0:
         return f"{diff.days} day{'s' if diff.days > 1 else ''} ago"
 
-    if diff.seconds > 3600:
-        hours = diff.seconds // 3600
-        return f"{hours} hour{'s' if hours > 1 else ''} ago"
-
-    if diff.seconds > 60:
-        minutes = diff.seconds // 60
-        return f"{minutes} minute{'s' if minutes > 1 else ''} ago"
-
-    return "just now"
+    return "Today"
 
 
 # Create method for time until
 def format_time_until(timestamp):
     """Calculate the time until a datetime stamp and format it as a human-readable string."""
 
-    # Convert timestap into datetime object
+    # Convert timestamp into datetime object
     timestamp = datetime.datetime.strptime(timestamp, '%Y-%m-%d')
 
     now = datetime.datetime.now()
@@ -338,10 +331,6 @@ def format_time_until(timestamp):
         minutes = diff.seconds // 60
         return f"in {minutes} minute{'s' if minutes > 1 else ''}"
 
-    return "now"
-
-
-
     if diff.days > 30:
         months = diff.days // 30
         return f"in {months} month{'s' if months > 1 else ''}"
@@ -349,15 +338,7 @@ def format_time_until(timestamp):
     if diff.days > 0:
         return f"in {diff.days} day{'s' if diff.days > 1 else ''}"
 
-    if diff.seconds > 3600:
-        hours = diff.seconds // 3600
-        return f"in {hours} hour{'s' if hours > 1 else ''}"
-
-    if diff.seconds > 60:
-        minutes = diff.seconds // 60
-        return f"in {minutes} minute{'s' if minutes > 1 else ''}"
-
-    return "now"
+    return "Today"
 
 
 app.jinja_env.filters['time_since'] = format_time_ago
@@ -425,7 +406,7 @@ def index():
         if user:
             # Reset login datetime
             user.reset_datetime = datetime.datetime.now()
-            PasswordResetLog.create(username=user.username, date_created=datetime.datetime.now()).save()
+            PasswordResetLog.create(username=user.username, date_created=datetime.datetime.now().strftime("%Y-%m-%d")).save()
             user.save()
 
             # Open the reset URL in a new tab if the URL is valid
@@ -609,7 +590,8 @@ def admin_ils_users():
     if request.method == 'POST':
         username = request.form.get('username')
         email = request.form.get('email')
-
+        date = request.form.get('date')
+        print(date)
         # Check to see if username already exists
         try:
             user = IlsUser.filter(IlsUser.username == username).first()
@@ -617,11 +599,15 @@ def admin_ils_users():
             print(e)
             user = None
 
+        # Check if date field was submitted if so convert to datetime object
+        if date is None or date == '':
+            date = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d')
+
         if user:
             message = 'Username already exists'
         else:
 
-            IlsUser.create(username=username, email=email, reset_datetime=datetime.datetime.now()).save()
+            IlsUser.create(username=username, email=email, reset_datetime=date).save()
             message = 'ILS User: %s created successfully' % username
             Log.create(username=session['username'], action='Created ILS User: %s' % username, ).save()
 
@@ -673,6 +659,7 @@ def admin_ils_users_edit(id):
     if request.method == 'POST':
         username = request.form.get('username')
         email = request.form.get('email')
+        date = request.form.get('date')
 
         # Check to see if username already exists
         all_users = list()
@@ -696,6 +683,10 @@ def admin_ils_users_edit(id):
 
             user.username = username
             user.email = email
+            if date is not None and date != '':
+                user.reset_datetime = date
+            else:
+                user.reset_datetime = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d')
             user.save()
             message = 'User updated successfully'
             Log.create(username=session['username'], action='Updated ILS user: %s' % username, ).save()
@@ -715,15 +706,16 @@ def admin_ils_users_csv_download():
     if not requires_auth():
         return redirect(url_for('login'))
     # Create a CSV file with the users and don't add a blank line between rows
-    with open('users.csv', 'w', newline='') as f:
+    with open('ils-users_%s.csv' % datetime.datetime.now().strftime('%Y-%m-%d'), 'w', newline='') as f:
         writer = csv.writer(f)
-        writer.writerow(['username', 'email'])
+        writer.writerow(['ILS Username', 'Email', 'Last Password Reset (YYYY-MM-DD)'])
         users = IlsUser.select().execute()
         for user in users:
-            writer.writerow([user.username, user.email])
+            date = datetime.datetime.strptime(user.reset_datetime, '%Y-%m-%d').strftime('%Y-%m-%d')
+            writer.writerow([user.username, user.email, date])
     Log.create(username=session['username'], action='Downloaded ILS user CSV file.').save()
     # return the CSV file to the user
-    return send_file('users.csv', as_attachment=True)
+    return send_file('ils-users_%s.csv' % datetime.datetime.now().strftime('%Y-%m-%d'), as_attachment=True)
 
 
 @app.route('/admin/users/ils/csv/import', methods=['GET', 'POST'])
@@ -741,9 +733,10 @@ def admin_ils_users_csv_import():
                 for row in reader:
                     username = row[0]
                     email = row[1]
+                    reset_date = row[2]
 
                     # ignore the header row
-                    if username == 'username':
+                    if username == 'ILS Username':
                         continue
 
                     # ignore blank rows
@@ -759,10 +752,19 @@ def admin_ils_users_csv_import():
 
                     if user:
                         user.email = email
-                        user.reset_datetime = datetime.datetime.now()
+                        # Check if the reset date is blank and if it is set it to the current date
+                        if reset_date == '' or reset_date is None:
+                            user.reset_datetime = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d')
+                        else:
+                            user.reset_datetime = reset_date
                         user.save()
                     else:
-                        IlsUser.create(username=username, email=email, reset_datetime=datetime.datetime.now()).save()
+                        if reset_date == '' or reset_date is None:
+                            user.reset_datetime = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d')
+                        else:
+                            reset_datetime = reset_date
+                        IlsUser.create(username=username, email=email, reset_datetime=reset_datetime).save()
+
             # Delete the uploaded file
             os.remove(os.path.join('uploads', csv_file.filename))
             return redirect(url_for('admin_ils_users'))

+ 35 - 4
templates/admin_ils_user_edit.html

@@ -9,18 +9,29 @@
 {% endif %}
 <div class="row">
     <div class="col">
-        <a href="{{ url_for('admin_ils_users') }}" class="btn btn-secondary float-end">Back</a>
+        <a href="{{ url_for('admin_ils_users') }}" class="btn btn-secondary">Back</a>
+    </div>
+    <div class="col text-center">
         <h3><i class="ri-shield-user-fill"></i> Edit ILS User</h3>
     </div>
+    <div class="col text-end">
+        <a href="#!" class="btn btn-danger" data-bs-toggle="modal" data-bs-target="#remove-user"><i class="ri-trash-fill"></i> Delete ILS User</a>
+    </div>
 </div>
-<div class="row">
+<div class="row justify-content-center">
     <div class="col-sm-12 col-md-6 col-lg-4">
         <form action="" method="post">
             <div class="mb-3">
-                <input type="text" class="form-control" value="{{ context.user.username }}" id="username" name="username" placeholder="Username" required>
+                <label class="form-label" for="username">ILS Username</label>
+                <input type="text" class="form-control" value="{{ context.user.username }}" id="username" name="username" required>
             </div>
             <div class="mb-3">
-                <input type="text" class="form-control" value="{{ context.user.email }}" id="email" name="email" placeholder="Email" required>
+                <label class="form-label" for="email">Email Address</label>
+                <input type="text" class="form-control" value="{{ context.user.email }}" id="email" name="email" required>
+            </div>
+            <div class="mb-3">
+                <label class="form-label" for="date">Last Password Reset Date</label>
+                <input type="date" class="form-control" id="date" name="date" value="{{ context.user.reset_datetime }}">
             </div>
             <div class="mb-3 text-center">
                 <input type="submit" class="btn btn-primary w-100" value="Save">
@@ -28,4 +39,24 @@
         </form>
     </div>
 </div>
+
+<div class="modal fade" id="remove-user" tabindex="-1">
+    <div class="modal-dialog modal-dialog-centered">
+        <div class="modal-content">
+            <div class="modal-header bg-light">
+                <h1 class="modal-title fs-5">Confirmation</h1>
+                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
+            </div>
+            <div class="modal-body">
+                <div class="mb-3">
+                    <p class="lead">Are you sure you want to delete this user?</p>
+                </div>
+            </div>
+            <div class="modal-footer bg-light">
+                <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
+                <a class="btn btn-danger" href="{{ url_for('admin_ils_users_delete', id=context.user.id) }}">Yes, remove the user</a>
+            </div>
+        </div>
+    </div>
+</div>
 {% endblock %}

+ 4 - 23
templates/admin_ils_users.html

@@ -25,7 +25,7 @@
                     <th scope="col">Email</th>
                     <th scope="col">Reset Date</th>
                     <th scope="col">Reset Age</th>
-                    <th scope="col">Actions</th>
+                    <th scope="col"></th>
                 </tr>
             </thead>
             <tbody>
@@ -37,7 +37,6 @@
                     <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="#!" class="btn btn-danger" data-bs-toggle="modal" data-bs-target="#remove-user-{{ loop.index0 }}">Delete</a>
                     </td>
                 </tr>
                 {% endfor %}
@@ -61,6 +60,9 @@
                     <div class="mb-3">
                         <input type="email" class="form-control" id="email" name="email" placeholder="Email" required>
                     </div>
+                    <div class="mb-3">
+                        <input type="date" class="form-control" id="date" name="date" placeholder="Last Password Reset Date">
+                    </div>
                 </div>
                 <div class="modal-footer bg-light">
                     <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
@@ -71,25 +73,4 @@
     </div>
 </div>
 
-{% for user in context.users %}
-<div class="modal fade" id="remove-user-{{ loop.index0 }}" tabindex="-1">
-    <div class="modal-dialog modal-dialog-centered">
-        <div class="modal-content">
-            <div class="modal-header bg-light">
-                <h1 class="modal-title fs-5">Confirmation</h1>
-                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
-            </div>
-            <div class="modal-body">
-                <div class="mb-3">
-                    <p class="lead">Are you sure you want to delete this user?</p>
-                </div>
-            </div>
-            <div class="modal-footer bg-light">
-                <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
-                <a class="btn btn-danger" href="{{ url_for('admin_ils_users_delete', id=user.id) }}">Yes, remove the user</a>
-            </div>
-        </div>
-    </div>
-</div>
-{% endfor %}
 {% endblock %}

+ 7 - 4
templates/auth_layout.html

@@ -12,9 +12,15 @@
 <body>
     <div class="container mb-5">
         <div class="row mt-5">
-            <div class="col-12 text-center">
+            <div class="col-4 text-start">
+
+            </div>
+            <div class="col-4 text-center">
                 <h1>ILS Password Manager</h1>
             </div>
+            <div class="col-4 text-end">
+                <a class="btn btn-danger text-white" href="{{ url_for('logout') }}"><i class="ri-logout-box-line"></i> Logout</a>
+            </div>
         </div>
         <div class="row mt-5 g-0 shadow bg-white">
             <div class="col-2 border" style="min-height:50vh;">
@@ -40,9 +46,6 @@
                     <li class="nav-item">
                         <a class="nav-link bg-light text-dark border-bottom" href="{{ url_for('settings') }}"><i class="ri-settings-5-line"></i> Settings</a>
                     </li>
-                    <li class="nav-item">
-                        <a class="nav-link bg-danger text-white border-bottom" href="{{ url_for('logout') }}"><i class="ri-logout-box-line"></i> Logout</a>
-                    </li>
                 </ul>
             </div>
             <div class="col-10 border-top border-end border-bottom p-3">