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