From d33ae2b25ed54e31e81dae9c741c20eb2fe18862 Mon Sep 17 00:00:00 2001 From: Satyam Kumar Verman Date: Fri, 20 Dec 2024 14:00:42 +0530 Subject: [PATCH 1/9] Update app.py --- app.py | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 78 insertions(+), 10 deletions(-) diff --git a/app.py b/app.py index 16a655e..08da426 100644 --- a/app.py +++ b/app.py @@ -1,28 +1,70 @@ -from flask import Flask, render_template, request, redirect, url_for, jsonify +from flask import Flask, render_template, request, redirect, url_for, jsonify, flash from flask_sqlalchemy import SQLAlchemy +from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user, login_manager from datetime import datetime import os + app = Flask(__name__) -# Configure the database -app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///notes.db' -app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +# Configure the base directory for SQLite and secret key for sessions +app.config['SECRET_KEY'] = 'your_secret_key' + +# Initialize the LoginManager +login_manager = LoginManager(app) +login_manager.login_view = 'login' + +# Initialize SQLAlchemy without a specific URI, as it will be set dynamically per user db = SQLAlchemy(app) -# Define the Note model +# User model for authentication +class User(UserMixin, db.Model): + id = db.Column(db.Integer, primary_key=True) + username = db.Column(db.String(100), unique=True, nullable=False) + password = db.Column(db.String(100), nullable=False) + +# Note model class Note(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(100), nullable=False) content = db.Column(db.Text, nullable=False) tags = db.Column(db.String(200), nullable=True) reminder = db.Column(db.DateTime, nullable=True) + user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) -# Initialize the database -with app.app_context(): - db.create_all() +# User loader function for Flask-Login +@login_manager.user_loader +def load_user(user_id): + return User.query.get(int(user_id)) + +# Route to login +@app.route('/login', methods=['GET', 'POST']) +def login(): + if request.method == 'POST': + username = request.form['username'] + password = request.form['password'] + + user = User.query.filter_by(username=username).first() + if user and user.password == password: # Simple check, use hashed passwords in production + login_user(user) + # Set user-specific database URI dynamically + app.config['SQLALCHEMY_DATABASE_URI'] = f"sqlite:///users/{username}_notes.db" + with app.app_context(): + db.create_all() # Create tables in the user's database + return redirect(url_for('home')) + else: + flash('Invalid credentials') + return render_template('login.html') + +# Route to log out +@app.route('/logout') +@login_required +def logout(): + logout_user() + return redirect(url_for('login')) # Route for the home page @app.route('/') +@login_required def home(): query = request.args.get('search', '') if query: @@ -34,11 +76,13 @@ def home(): # Route to display the create note form @app.route('/create-note') +@login_required def create_note_form(): return render_template('index.html') # Route to create a new note @app.route('/notes', methods=['POST']) +@login_required def create_note(): data = request.json reminder = datetime.fromisoformat(data.get('reminder')) if data.get('reminder') else None @@ -47,7 +91,8 @@ def create_note(): title=data['title'], content=data['content'], tags=data.get('tags', ''), - reminder=reminder + reminder=reminder, + user_id=current_user.id ) db.session.add(new_note) db.session.commit() @@ -55,6 +100,7 @@ def create_note(): # Route to delete a note by its ID @app.route('/notes/', methods=['DELETE']) +@login_required def delete_note(id): note = Note.query.get_or_404(id) db.session.delete(note) @@ -63,12 +109,14 @@ def delete_note(id): # Route to render the edit note form @app.route('/notes//edit', methods=['GET']) +@login_required def edit_note_form(id): note = Note.query.get_or_404(id) return render_template('edit.html', note=note) # Route to update a note @app.route('/notes/', methods=['PUT']) +@login_required def update_note(id): note = Note.query.get_or_404(id) data = request.json @@ -79,6 +127,26 @@ def update_note(id): db.session.commit() return jsonify({'message': 'Note updated successfully'}), 200 +# Route to register a new user +@app.route('/register', methods=['GET', 'POST']) +def register(): + if request.method == 'POST': + username = request.form['username'] + password = request.form['password'] + + existing_user = User.query.filter_by(username=username).first() + if existing_user: + flash('Username already exists!') + return redirect(url_for('register')) + + new_user = User(username=username, password=password) + db.session.add(new_user) + db.session.commit() + + flash('User registered successfully!') + return redirect(url_for('login')) + return render_template('register.html') + if __name__ == '__main__': app.run() - + From 89a02cb51848de914ec79c9a4d95b53966eae975 Mon Sep 17 00:00:00 2001 From: Satyam Kumar Verman Date: Fri, 20 Dec 2024 14:01:12 +0530 Subject: [PATCH 2/9] Create register.html --- templates/register.html | 1 + 1 file changed, 1 insertion(+) create mode 100644 templates/register.html diff --git a/templates/register.html b/templates/register.html new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/templates/register.html @@ -0,0 +1 @@ + From f558beda8977ef656f20d258c173651f3b03d5a8 Mon Sep 17 00:00:00 2001 From: Satyam Kumar Verman Date: Fri, 20 Dec 2024 14:01:25 +0530 Subject: [PATCH 3/9] Create login.html --- templates/login.html | 1 + 1 file changed, 1 insertion(+) create mode 100644 templates/login.html diff --git a/templates/login.html b/templates/login.html new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/templates/login.html @@ -0,0 +1 @@ + From e158f015d32e30ffd74a8be7c367587f48f4e63e Mon Sep 17 00:00:00 2001 From: Satyam Kumar Verman Date: Fri, 20 Dec 2024 14:02:01 +0530 Subject: [PATCH 4/9] Update login.html --- templates/login.html | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/templates/login.html b/templates/login.html index 8b13789..5e6a848 100644 --- a/templates/login.html +++ b/templates/login.html @@ -1 +1,26 @@ + + + + + + Login + + + +
+

Login

+
+
+ + +
+
+ + +
+ +
+
+ + From fd5da26a8b5ad321c2a649eb09fe356988365fb5 Mon Sep 17 00:00:00 2001 From: Satyam Kumar Verman Date: Fri, 20 Dec 2024 14:02:58 +0530 Subject: [PATCH 5/9] Update register.html --- templates/register.html | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/templates/register.html b/templates/register.html index 8b13789..a0d9939 100644 --- a/templates/register.html +++ b/templates/register.html @@ -1 +1,26 @@ + + + + + + Register + + + +
+

Register

+
+
+ + +
+
+ + +
+ +
+
+ + From 0e7045ba1d03eb4698c31820b0ca08b66751ec1f Mon Sep 17 00:00:00 2001 From: Satyam Kumar Verman Date: Fri, 20 Dec 2024 14:03:27 +0530 Subject: [PATCH 6/9] Update requirements.txt --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 2bc620d..908632e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ flask flask_sqlalchemy +flask_login werkzeug gunicorn From 623b3d5ede0ec52700e289ba92f7ee0e2732eb42 Mon Sep 17 00:00:00 2001 From: Satyam Kumar Verman Date: Fri, 20 Dec 2024 14:07:21 +0530 Subject: [PATCH 7/9] Update app.py --- app.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/app.py b/app.py index 08da426..33f6d43 100644 --- a/app.py +++ b/app.py @@ -1,22 +1,23 @@ from flask import Flask, render_template, request, redirect, url_for, jsonify, flash from flask_sqlalchemy import SQLAlchemy -from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user, login_manager +from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user from datetime import datetime import os app = Flask(__name__) -# Configure the base directory for SQLite and secret key for sessions +# Set a default database URI for the app +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False app.config['SECRET_KEY'] = 'your_secret_key' -# Initialize the LoginManager +# Initialize the SQLAlchemy object (without a URI yet) +db = SQLAlchemy(app) + +# Initialize LoginManager login_manager = LoginManager(app) login_manager.login_view = 'login' -# Initialize SQLAlchemy without a specific URI, as it will be set dynamically per user -db = SQLAlchemy(app) - -# User model for authentication +# User model class User(UserMixin, db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(100), unique=True, nullable=False) @@ -47,7 +48,8 @@ def login(): if user and user.password == password: # Simple check, use hashed passwords in production login_user(user) # Set user-specific database URI dynamically - app.config['SQLALCHEMY_DATABASE_URI'] = f"sqlite:///users/{username}_notes.db" + user_db_uri = f"sqlite:///users/{username}_notes.db" + app.config['SQLALCHEMY_DATABASE_URI'] = user_db_uri with app.app_context(): db.create_all() # Create tables in the user's database return redirect(url_for('home')) @@ -148,5 +150,6 @@ def register(): return render_template('register.html') if __name__ == '__main__': - app.run() - + # Set the default database for the app before running + app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///default.db' + app.run(debug=True) From 8d4029812c9ef188534845a1530d481439eb2bba Mon Sep 17 00:00:00 2001 From: Satyam Kumar Verman Date: Fri, 20 Dec 2024 14:10:25 +0530 Subject: [PATCH 8/9] Update app.py --- app.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/app.py b/app.py index 33f6d43..a3575b9 100644 --- a/app.py +++ b/app.py @@ -6,24 +6,28 @@ app = Flask(__name__) -# Set a default database URI for the app +# Default SQLite database URI for development (without user-specific db) app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False app.config['SECRET_KEY'] = 'your_secret_key' -# Initialize the SQLAlchemy object (without a URI yet) +# Ensure persistent storage for SQLite databases (in Render's file system) +if not os.path.exists('users'): + os.makedirs('users') # Ensure the 'users' directory exists for storing user databases + +# Initialize SQLAlchemy object db = SQLAlchemy(app) # Initialize LoginManager login_manager = LoginManager(app) login_manager.login_view = 'login' -# User model +# User model for authentication class User(UserMixin, db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(100), unique=True, nullable=False) password = db.Column(db.String(100), nullable=False) -# Note model +# Note model for storing notes class Note(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(100), nullable=False) @@ -50,8 +54,11 @@ def login(): # Set user-specific database URI dynamically user_db_uri = f"sqlite:///users/{username}_notes.db" app.config['SQLALCHEMY_DATABASE_URI'] = user_db_uri + + # Create all tables for this user with app.app_context(): db.create_all() # Create tables in the user's database + return redirect(url_for('home')) else: flash('Invalid credentials') @@ -150,6 +157,7 @@ def register(): return render_template('register.html') if __name__ == '__main__': - # Set the default database for the app before running + # Set default database URI until a user logs in app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///default.db' app.run(debug=True) + From 024a9fce8ad9a0860d5a385d47e8b51ef4497a4a Mon Sep 17 00:00:00 2001 From: Satyam Kumar Verman Date: Fri, 20 Dec 2024 14:17:29 +0530 Subject: [PATCH 9/9] Update app.py --- app.py | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/app.py b/app.py index a3575b9..6a9167b 100644 --- a/app.py +++ b/app.py @@ -6,28 +6,27 @@ app = Flask(__name__) -# Default SQLite database URI for development (without user-specific db) +# Configure the application +app.config['SECRET_KEY'] = 'your_secret_key' # Replace with a secure key app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False -app.config['SECRET_KEY'] = 'your_secret_key' -# Ensure persistent storage for SQLite databases (in Render's file system) -if not os.path.exists('users'): - os.makedirs('users') # Ensure the 'users' directory exists for storing user databases +# Default database URI (used before user login) +app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///default.db' -# Initialize SQLAlchemy object +# Initialize the database db = SQLAlchemy(app) -# Initialize LoginManager +# Initialize the login manager login_manager = LoginManager(app) login_manager.login_view = 'login' -# User model for authentication +# User model class User(UserMixin, db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(100), unique=True, nullable=False) password = db.Column(db.String(100), nullable=False) -# Note model for storing notes +# Note model class Note(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(100), nullable=False) @@ -36,7 +35,7 @@ class Note(db.Model): reminder = db.Column(db.DateTime, nullable=True) user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) -# User loader function for Flask-Login +# User loader function @login_manager.user_loader def load_user(user_id): return User.query.get(int(user_id)) @@ -49,15 +48,15 @@ def login(): password = request.form['password'] user = User.query.filter_by(username=username).first() - if user and user.password == password: # Simple check, use hashed passwords in production + if user and user.password == password: # In production, use hashed passwords login_user(user) - # Set user-specific database URI dynamically + # Set user-specific database URI user_db_uri = f"sqlite:///users/{username}_notes.db" app.config['SQLALCHEMY_DATABASE_URI'] = user_db_uri # Create all tables for this user with app.app_context(): - db.create_all() # Create tables in the user's database + db.create_all() return redirect(url_for('home')) else: @@ -157,7 +156,12 @@ def register(): return render_template('register.html') if __name__ == '__main__': - # Set default database URI until a user logs in - app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///default.db' - app.run(debug=True) + # Ensure the 'users' directory exists for storing user databases + if not os.path.exists('users'): + os.makedirs('users') + + # Initialize the default database + with app.app_context(): + db.create_all() + app.run(debug=True)