server-logs #18
31
app/app.py
31
app/app.py
@@ -7,6 +7,10 @@ from misc import datetime, date, time, currDay, prevDay, ZoneInfo, currVersion,
|
|||||||
from db import (db, Period, Task, Event, User)
|
from db import (db, Period, Task, Event, User)
|
||||||
from forms import (TaskForm, EventForm, PeriodForm, SignupForm, LoginForm, SettingsForm)
|
from forms import (TaskForm, EventForm, PeriodForm, SignupForm, LoginForm, SettingsForm)
|
||||||
from create_events import createEvents
|
from create_events import createEvents
|
||||||
|
from log import appLogger
|
||||||
|
|
||||||
|
# init logger
|
||||||
|
logger = appLogger('app')
|
||||||
|
|
||||||
basedir = os.path.abspath(os.path.dirname(__file__))
|
basedir = os.path.abspath(os.path.dirname(__file__))
|
||||||
|
|
||||||
@@ -25,10 +29,6 @@ db.init_app(app)
|
|||||||
migrate = Migrate()
|
migrate = Migrate()
|
||||||
migrate.init_app(app, db)
|
migrate.init_app(app, db)
|
||||||
|
|
||||||
# Schedule creation of events every hour
|
|
||||||
#with app.app_context():
|
|
||||||
# scheduleCreateEvents(app, db, currDay, Period, Event, createEvents)
|
|
||||||
|
|
||||||
# Authentication stuff
|
# Authentication stuff
|
||||||
|
|
||||||
login_manager = LoginManager()
|
login_manager = LoginManager()
|
||||||
@@ -78,6 +78,7 @@ def index():
|
|||||||
# Authentication routes
|
# Authentication routes
|
||||||
@app.route('/login', methods=['GET', 'POST'])
|
@app.route('/login', methods=['GET', 'POST'])
|
||||||
def login():
|
def login():
|
||||||
|
sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
|
||||||
form = LoginForm()
|
form = LoginForm()
|
||||||
if form.validate_on_submit():
|
if form.validate_on_submit():
|
||||||
userName = form.userName.data
|
userName = form.userName.data
|
||||||
@@ -87,13 +88,16 @@ def login():
|
|||||||
user = User.query.filter_by(userName=userName).first()
|
user = User.query.filter_by(userName=userName).first()
|
||||||
if not user or not check_password_hash(user.password, password):
|
if not user or not check_password_hash(user.password, password):
|
||||||
flash('Credentials incorrect! Please try again')
|
flash('Credentials incorrect! Please try again')
|
||||||
|
logger.info(f'User \'{userName}\' logon FAILED (bad password) from {sourceIP}')
|
||||||
return redirect(url_for('login'))
|
return redirect(url_for('login'))
|
||||||
login_user(user, remember=remember)
|
login_user(user, remember=remember)
|
||||||
|
logger.info(f'User \'{userName}\' logged in successfully from {sourceIP}')
|
||||||
return redirect(url_for('events'))
|
return redirect(url_for('events'))
|
||||||
return render_template('login.html', form=form)
|
return render_template('login.html', form=form)
|
||||||
|
|
||||||
@app.route('/createaccount', methods=['GET', 'POST'])
|
@app.route('/createaccount', methods=['GET', 'POST'])
|
||||||
def createAccount():
|
def createAccount():
|
||||||
|
sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
|
||||||
if signup_enabled == True:
|
if signup_enabled == True:
|
||||||
form = SignupForm()
|
form = SignupForm()
|
||||||
if form.validate_on_submit():
|
if form.validate_on_submit():
|
||||||
@@ -105,6 +109,7 @@ def createAccount():
|
|||||||
password=generate_password_hash(form.password.data, method='sha256'))
|
password=generate_password_hash(form.password.data, method='sha256'))
|
||||||
db.session.add(new_user)
|
db.session.add(new_user)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
logger.info(f'New user \'{new_user.userName}\' created from {sourceIP}')
|
||||||
|
|
||||||
return redirect(url_for('login'))
|
return redirect(url_for('login'))
|
||||||
return render_template('createAccount.html', form=form)
|
return render_template('createAccount.html', form=form)
|
||||||
@@ -113,12 +118,15 @@ def createAccount():
|
|||||||
@app.route('/logout')
|
@app.route('/logout')
|
||||||
@login_required
|
@login_required
|
||||||
def logout():
|
def logout():
|
||||||
|
sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
|
||||||
|
logger.info(f'User \'{current_user.userName}\' logged out from {sourceIP} ')
|
||||||
logout_user()
|
logout_user()
|
||||||
return redirect(url_for('index'))
|
return redirect(url_for('index'))
|
||||||
|
|
||||||
@app.route('/settings', methods=('GET', 'POST'))
|
@app.route('/settings', methods=('GET', 'POST'))
|
||||||
@login_required
|
@login_required
|
||||||
def settings():
|
def settings():
|
||||||
|
sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
|
||||||
user = User.query.get_or_404(current_user.id)
|
user = User.query.get_or_404(current_user.id)
|
||||||
form = SettingsForm(obj=user)
|
form = SettingsForm(obj=user)
|
||||||
if form.validate_on_submit():
|
if form.validate_on_submit():
|
||||||
@@ -127,6 +135,7 @@ def settings():
|
|||||||
if form.password.data != '':
|
if form.password.data != '':
|
||||||
user.password = generate_password_hash(form.password.data, method='sha256')
|
user.password = generate_password_hash(form.password.data, method='sha256')
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
logger.info(f'User \'{current_user.userName}\' settings changed from {sourceIP}')
|
||||||
return render_template('settings.html', form=form)
|
return render_template('settings.html', form=form)
|
||||||
|
|
||||||
# Periods routes
|
# Periods routes
|
||||||
@@ -139,6 +148,7 @@ def periods():
|
|||||||
@app.route('/period/new', methods=('GET', 'POST'))
|
@app.route('/period/new', methods=('GET', 'POST'))
|
||||||
@login_required
|
@login_required
|
||||||
def newPeriod():
|
def newPeriod():
|
||||||
|
sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
|
||||||
form = PeriodForm()
|
form = PeriodForm()
|
||||||
if form.validate_on_submit():
|
if form.validate_on_submit():
|
||||||
period = Period(periodTime=form.periodTime.data,
|
period = Period(periodTime=form.periodTime.data,
|
||||||
@@ -146,6 +156,7 @@ def newPeriod():
|
|||||||
)
|
)
|
||||||
db.session.add(period)
|
db.session.add(period)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
logger.info(f'New period added by \'{current_user.userName}\' from {sourceIP}')
|
||||||
# Run createEvents upon adding new period
|
# Run createEvents upon adding new period
|
||||||
createEvents(db, currDay, Period, Event)
|
createEvents(db, currDay, Period, Event)
|
||||||
return redirect(f'/period/edit/{period.period}')
|
return redirect(f'/period/edit/{period.period}')
|
||||||
@@ -155,21 +166,25 @@ def newPeriod():
|
|||||||
@app.route('/period/edit/<int:periodNum>', methods=('GET', 'POST'))
|
@app.route('/period/edit/<int:periodNum>', methods=('GET', 'POST'))
|
||||||
@login_required
|
@login_required
|
||||||
def editPeriod(periodNum):
|
def editPeriod(periodNum):
|
||||||
|
sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
|
||||||
period = Period.query.get_or_404(periodNum)
|
period = Period.query.get_or_404(periodNum)
|
||||||
form = PeriodForm(obj=period)
|
form = PeriodForm(obj=period)
|
||||||
if form.validate_on_submit():
|
if form.validate_on_submit():
|
||||||
period.periodTime = form.periodTime.data
|
period.periodTime = form.periodTime.data
|
||||||
period.weekendSchedule = form.weekendSchedule.data
|
period.weekendSchedule = form.weekendSchedule.data
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
logger.info(f'Period {periodNum} edited by \'{current_user.userName}\' from {sourceIP}')
|
||||||
return redirect(f'/period/edit/{periodNum}')
|
return redirect(f'/period/edit/{periodNum}')
|
||||||
return render_template('editPeriod.html', period=period, form=form, datetime=datetime)
|
return render_template('editPeriod.html', period=period, form=form, datetime=datetime)
|
||||||
|
|
||||||
@app.post('/period/delete/<int:periodNum>')
|
@app.post('/period/delete/<int:periodNum>')
|
||||||
@login_required
|
@login_required
|
||||||
def delete_period(periodNum):
|
def delete_period(periodNum):
|
||||||
|
sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
|
||||||
period = Period.query.get_or_404(periodNum)
|
period = Period.query.get_or_404(periodNum)
|
||||||
db.session.delete(period)
|
db.session.delete(period)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
logger.info(f'Period {periodNum} deleted by \'{current_user.userName}\' from {sourceIP}')
|
||||||
return redirect('/periods')
|
return redirect('/periods')
|
||||||
|
|
||||||
|
|
||||||
@@ -185,6 +200,7 @@ def events():
|
|||||||
@app.route('/event/edit/<int:event_id>/', methods=('GET', 'POST'))
|
@app.route('/event/edit/<int:event_id>/', methods=('GET', 'POST'))
|
||||||
@login_required
|
@login_required
|
||||||
def editEvent(event_id):
|
def editEvent(event_id):
|
||||||
|
sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
|
||||||
event = Event.query.get_or_404(event_id)
|
event = Event.query.get_or_404(event_id)
|
||||||
form = EventForm(obj=event)
|
form = EventForm(obj=event)
|
||||||
if form.validate_on_submit():
|
if form.validate_on_submit():
|
||||||
@@ -193,6 +209,7 @@ def editEvent(event_id):
|
|||||||
else:
|
else:
|
||||||
event.task_id = None
|
event.task_id = None
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
logger.info(f'Event {event_id} edited by \'{current_user.userName}\' from {sourceIP}')
|
||||||
return redirect('/events')
|
return redirect('/events')
|
||||||
return render_template('editEvent.html', event=event, form=form, datetime=datetime)
|
return render_template('editEvent.html', event=event, form=form, datetime=datetime)
|
||||||
|
|
||||||
@@ -212,6 +229,7 @@ def task(task_id):
|
|||||||
@app.route('/task/new', methods=('GET', 'POST'))
|
@app.route('/task/new', methods=('GET', 'POST'))
|
||||||
@login_required
|
@login_required
|
||||||
def newTask():
|
def newTask():
|
||||||
|
sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
|
||||||
form = TaskForm()
|
form = TaskForm()
|
||||||
if form.validate_on_submit():
|
if form.validate_on_submit():
|
||||||
task = Task(title=form.title.data,
|
task = Task(title=form.title.data,
|
||||||
@@ -219,24 +237,29 @@ def newTask():
|
|||||||
created_timestamp=int(time.time()))
|
created_timestamp=int(time.time()))
|
||||||
db.session.add(task)
|
db.session.add(task)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
logger.info(f'New task added by \'{current_user.userName}\' from {sourceIP}')
|
||||||
return redirect(f'/task/{task.id}')
|
return redirect(f'/task/{task.id}')
|
||||||
return render_template('newtask.html', form=form)
|
return render_template('newtask.html', form=form)
|
||||||
|
|
||||||
@app.route('/task/<int:task_id>/edit', methods=('GET', 'POST'))
|
@app.route('/task/<int:task_id>/edit', methods=('GET', 'POST'))
|
||||||
@login_required
|
@login_required
|
||||||
def editTask(task_id):
|
def editTask(task_id):
|
||||||
|
sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
|
||||||
task = Task.query.get_or_404(task_id)
|
task = Task.query.get_or_404(task_id)
|
||||||
form = TaskForm(obj=task)
|
form = TaskForm(obj=task)
|
||||||
if form.validate_on_submit():
|
if form.validate_on_submit():
|
||||||
task.title=form.title.data
|
task.title=form.title.data
|
||||||
task.description=form.description.data
|
task.description=form.description.data
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
logger.info(f'Task {task_id} edited by \'{current_user.userName}\' from {sourceIP}')
|
||||||
return redirect(f'/task/{task_id}')
|
return redirect(f'/task/{task_id}')
|
||||||
return render_template('edittask.html', task=task, form=form)
|
return render_template('edittask.html', task=task, form=form)
|
||||||
@app.post('/task/<int:task_id>/delete')
|
@app.post('/task/<int:task_id>/delete')
|
||||||
@login_required
|
@login_required
|
||||||
def delete_task(task_id):
|
def delete_task(task_id):
|
||||||
|
sourceIP = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
|
||||||
task = Task.query.get_or_404(task_id)
|
task = Task.query.get_or_404(task_id)
|
||||||
db.session.delete(task)
|
db.session.delete(task)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
logger.info(f'Task {task_id} deleted by \'{current_user.userName}\' from {sourceIP}')
|
||||||
return redirect('/tasks')
|
return redirect('/tasks')
|
@@ -1,3 +1,6 @@
|
|||||||
|
from log import appLogger
|
||||||
|
|
||||||
|
logger = appLogger('app')
|
||||||
def createEvents(db, currDay, Period, Event):
|
def createEvents(db, currDay, Period, Event):
|
||||||
periods = Period.query.all()
|
periods = Period.query.all()
|
||||||
for period in periods:
|
for period in periods:
|
||||||
@@ -10,4 +13,4 @@ def createEvents(db, currDay, Period, Event):
|
|||||||
db.session.add(event)
|
db.session.add(event)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
print("createEvents script ran successfully")
|
logger.info('createEvents script ran successfully')
|
12
app/log.py
Normal file
12
app/log.py
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import logging
|
||||||
|
import sys
|
||||||
|
|
||||||
|
def appLogger(name):
|
||||||
|
formatter = logging.Formatter(fmt='%(asctime)s %(levelname)-8s %(message)s',
|
||||||
|
datefmt='%Y-%m-%d %H:%M:%S')
|
||||||
|
screen_handler = logging.StreamHandler(stream=sys.stdout)
|
||||||
|
screen_handler.setFormatter(formatter)
|
||||||
|
logger = logging.getLogger(name)
|
||||||
|
logger.setLevel(logging.DEBUG)
|
||||||
|
logger.addHandler(screen_handler)
|
||||||
|
return logger
|
Reference in New Issue
Block a user