166 lines
4.1 KiB
Python
166 lines
4.1 KiB
Python
from flask import Flask, render_template, request, url_for, redirect, session
|
|
from functools import wraps
|
|
from sqlalchemy import or_
|
|
from markdown import markdown
|
|
from database import db, User, Note
|
|
|
|
app = Flask(__name__)
|
|
|
|
|
|
def login_required(f):
|
|
# Decoration: check login in session
|
|
@wraps(f)
|
|
def decorated_function(*args, **kwargs):
|
|
if 'user_id' not in session:
|
|
session.clear()
|
|
return redirect(url_for('index'))
|
|
return f(*args, **kwargs)
|
|
return decorated_function
|
|
|
|
|
|
@app.route('/')
|
|
def index(data=None):
|
|
return render_template('items/login.html', data=data)
|
|
|
|
|
|
@app.route('/login', methods=['POST'])
|
|
def login():
|
|
data = dict()
|
|
if request.form['email'] and request.form['password']:
|
|
# Checks if the user exists
|
|
data['email'] = request.form['email']
|
|
data['password'] = request.form['password']
|
|
my_user = User.query.filter_by(
|
|
email=data['email'], password=data['password']).first()
|
|
if my_user:
|
|
# Create user session
|
|
session['user_id'] = my_user.id
|
|
session['user_email'] = my_user.email
|
|
return redirect(url_for('dashboard'))
|
|
else:
|
|
data['error'] = True
|
|
else:
|
|
data['error'] = True
|
|
|
|
return index(data)
|
|
|
|
|
|
@app.route('/logout')
|
|
@login_required
|
|
def logout():
|
|
# Clear sessions
|
|
session.clear()
|
|
|
|
return redirect(url_for('index'))
|
|
|
|
|
|
@app.route('/dashboard')
|
|
@login_required
|
|
def dashboard(my_param_note=None):
|
|
my_main_note = None
|
|
|
|
# Searchs
|
|
my_notes = my_param_note
|
|
if not my_notes:
|
|
# Nothing found
|
|
my_notes = Note.query.filter_by(
|
|
user_id=session['user_id']).order_by(Note.id.desc()).all()
|
|
if my_notes:
|
|
# Show first result
|
|
my_main_note = my_notes[0]
|
|
|
|
# Show first note
|
|
if request.args.get('id'):
|
|
my_note_temp = Note.query.filter_by(id=request.args.get('id')).first()
|
|
# Is there any note in the database?
|
|
if my_note_temp:
|
|
my_main_note = my_note_temp
|
|
|
|
# Data for template
|
|
data = dict()
|
|
data['notes'] = my_notes
|
|
data['main_note'] = my_main_note
|
|
data['markdown'] = markdown
|
|
|
|
return render_template('items/dashboard.html', data=data)
|
|
|
|
|
|
@app.route('/search')
|
|
@login_required
|
|
def search():
|
|
q = request.args.get('q')
|
|
|
|
return dashboard(Note.query.filter(
|
|
or_(Note.title.like('%' + q + '%'), Note.text.like('%' + q + '%')
|
|
)).filter_by(user_id=session['user_id']).order_by(Note.id.desc()).all())
|
|
|
|
|
|
@app.route('/new')
|
|
@login_required
|
|
def new():
|
|
return render_template('items/new.html')
|
|
|
|
|
|
@app.route('/new/save', methods=['POST'])
|
|
@login_required
|
|
def save_note():
|
|
myNote = Note(request.form['title'], request.form[
|
|
'text'], session['user_id'])
|
|
# Create
|
|
db.session.add(myNote)
|
|
db.session.commit()
|
|
|
|
return redirect(url_for('dashboard'))
|
|
|
|
|
|
@app.route('/edit')
|
|
@login_required
|
|
def edit(data=None):
|
|
id = request.args.get('id')
|
|
my_note = Note.query.filter_by(id=id).first()
|
|
data = dict()
|
|
data['main_note'] = my_note
|
|
return render_template('items/edit.html', data=data)
|
|
|
|
|
|
@app.route('/edit_note', methods=['POST'])
|
|
@login_required
|
|
def edit_note(data=None):
|
|
if request.form['id']:
|
|
# Update
|
|
my_note = Note.query.filter_by(id=request.form['id']).first()
|
|
my_note.title = request.form['title']
|
|
my_note.text = request.form['text']
|
|
db.session.commit()
|
|
|
|
return redirect(url_for('dashboard'))
|
|
|
|
|
|
@app.route('/delete')
|
|
@login_required
|
|
def delete():
|
|
id = request.args.get('id')
|
|
my_note = Note.query.filter_by(id=id).first()
|
|
data = dict()
|
|
data['main_note'] = my_note
|
|
data['markdown'] = markdown
|
|
|
|
return render_template('items/delete.html', data=data)
|
|
|
|
|
|
@app.route('/delete_note')
|
|
@login_required
|
|
def delete_note():
|
|
id = request.args.get('id')
|
|
# Delete
|
|
my_note = Note.query.filter_by(id=id).first()
|
|
db.session.delete(my_note)
|
|
db.session.commit()
|
|
|
|
return redirect(url_for('dashboard', id=id))
|
|
|
|
# App
|
|
if __name__ == "__main__":
|
|
app.secret_key = 'secret'
|
|
app.run()
|