1- from flask import Flask , render_template , request , redirect , url_for , jsonify
1+ from flask import Flask , render_template , request , redirect , url_for , jsonify , flash
22from flask_sqlalchemy import SQLAlchemy
3+ from flask_login import LoginManager , UserMixin , login_user , login_required , logout_user , current_user , login_manager
34from datetime import datetime
45import os
6+
57app = Flask (__name__ )
68
7- # Configure the database
8- app .config ['SQLALCHEMY_DATABASE_URI' ] = 'sqlite:///notes.db'
9- app .config ['SQLALCHEMY_TRACK_MODIFICATIONS' ] = False
9+ # Configure the base directory for SQLite and secret key for sessions
10+ app .config ['SECRET_KEY' ] = 'your_secret_key'
11+
12+ # Initialize the LoginManager
13+ login_manager = LoginManager (app )
14+ login_manager .login_view = 'login'
15+
16+ # Initialize SQLAlchemy without a specific URI, as it will be set dynamically per user
1017db = SQLAlchemy (app )
1118
12- # Define the Note model
19+ # User model for authentication
20+ class User (UserMixin , db .Model ):
21+ id = db .Column (db .Integer , primary_key = True )
22+ username = db .Column (db .String (100 ), unique = True , nullable = False )
23+ password = db .Column (db .String (100 ), nullable = False )
24+
25+ # Note model
1326class Note (db .Model ):
1427 id = db .Column (db .Integer , primary_key = True )
1528 title = db .Column (db .String (100 ), nullable = False )
1629 content = db .Column (db .Text , nullable = False )
1730 tags = db .Column (db .String (200 ), nullable = True )
1831 reminder = db .Column (db .DateTime , nullable = True )
32+ user_id = db .Column (db .Integer , db .ForeignKey ('user.id' ), nullable = False )
1933
20- # Initialize the database
21- with app .app_context ():
22- db .create_all ()
34+ # User loader function for Flask-Login
35+ @login_manager .user_loader
36+ def load_user (user_id ):
37+ return User .query .get (int (user_id ))
38+
39+ # Route to login
40+ @app .route ('/login' , methods = ['GET' , 'POST' ])
41+ def login ():
42+ if request .method == 'POST' :
43+ username = request .form ['username' ]
44+ password = request .form ['password' ]
45+
46+ user = User .query .filter_by (username = username ).first ()
47+ if user and user .password == password : # Simple check, use hashed passwords in production
48+ login_user (user )
49+ # Set user-specific database URI dynamically
50+ app .config ['SQLALCHEMY_DATABASE_URI' ] = f"sqlite:///users/{ username } _notes.db"
51+ with app .app_context ():
52+ db .create_all () # Create tables in the user's database
53+ return redirect (url_for ('home' ))
54+ else :
55+ flash ('Invalid credentials' )
56+ return render_template ('login.html' )
57+
58+ # Route to log out
59+ @app .route ('/logout' )
60+ @login_required
61+ def logout ():
62+ logout_user ()
63+ return redirect (url_for ('login' ))
2364
2465# Route for the home page
2566@app .route ('/' )
67+ @login_required
2668def home ():
2769 query = request .args .get ('search' , '' )
2870 if query :
@@ -34,11 +76,13 @@ def home():
3476
3577# Route to display the create note form
3678@app .route ('/create-note' )
79+ @login_required
3780def create_note_form ():
3881 return render_template ('index.html' )
3982
4083# Route to create a new note
4184@app .route ('/notes' , methods = ['POST' ])
85+ @login_required
4286def create_note ():
4387 data = request .json
4488 reminder = datetime .fromisoformat (data .get ('reminder' )) if data .get ('reminder' ) else None
@@ -47,14 +91,16 @@ def create_note():
4791 title = data ['title' ],
4892 content = data ['content' ],
4993 tags = data .get ('tags' , '' ),
50- reminder = reminder
94+ reminder = reminder ,
95+ user_id = current_user .id
5196 )
5297 db .session .add (new_note )
5398 db .session .commit ()
5499 return jsonify ({'message' : 'Note created successfully' }), 201
55100
56101# Route to delete a note by its ID
57102@app .route ('/notes/<int:id>' , methods = ['DELETE' ])
103+ @login_required
58104def delete_note (id ):
59105 note = Note .query .get_or_404 (id )
60106 db .session .delete (note )
@@ -63,12 +109,14 @@ def delete_note(id):
63109
64110# Route to render the edit note form
65111@app .route ('/notes/<int:id>/edit' , methods = ['GET' ])
112+ @login_required
66113def edit_note_form (id ):
67114 note = Note .query .get_or_404 (id )
68115 return render_template ('edit.html' , note = note )
69116
70117# Route to update a note
71118@app .route ('/notes/<int:id>' , methods = ['PUT' ])
119+ @login_required
72120def update_note (id ):
73121 note = Note .query .get_or_404 (id )
74122 data = request .json
@@ -79,6 +127,26 @@ def update_note(id):
79127 db .session .commit ()
80128 return jsonify ({'message' : 'Note updated successfully' }), 200
81129
130+ # Route to register a new user
131+ @app .route ('/register' , methods = ['GET' , 'POST' ])
132+ def register ():
133+ if request .method == 'POST' :
134+ username = request .form ['username' ]
135+ password = request .form ['password' ]
136+
137+ existing_user = User .query .filter_by (username = username ).first ()
138+ if existing_user :
139+ flash ('Username already exists!' )
140+ return redirect (url_for ('register' ))
141+
142+ new_user = User (username = username , password = password )
143+ db .session .add (new_user )
144+ db .session .commit ()
145+
146+ flash ('User registered successfully!' )
147+ return redirect (url_for ('login' ))
148+ return render_template ('register.html' )
149+
82150if __name__ == '__main__' :
83151 app .run ()
84-
152+
0 commit comments