Guest User

templates folder html code

a guest
Nov 3rd, 2024
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.56 KB | None | 0 0
  1. # mis imports
  2. import os
  3. from typing import List, Optional
  4.  
  5. # flask imports
  6. from flask import Flask, flash, redirect, render_template, url_for
  7. from flask_login import (LoginManager, UserMixin, current_user, login_required, login_user, logout_user)
  8. from flask_sqlalchemy import SQLAlchemy
  9. # forms
  10. from flask_wtf import FlaskForm
  11. from sqlalchemy import ForeignKey, String
  12. from sqlalchemy.orm import Mapped, mapped_column, relationship
  13. from wtforms import StringField, SubmitField
  14. from wtforms.validators import DataRequired
  15.  
  16. basedir = os.path.abspath(os.path.dirname(__file__))
  17. # create the app
  18. app = Flask(__name__)
  19. login_manager = LoginManager(app)
  20. # create the extension'
  21. # requires you to login
  22. login_manager.login_view = 'login'
  23. db = SQLAlchemy()
  24.  
  25.  
  26. # configure the SQLite database, relative to the app instance folder
  27. app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///project.db"
  28. # initialize the app with the extension
  29. db.init_app(app)
  30. login_manager.init_app(app)
  31. app.config['SECRET_KEY'] = 'secret key'
  32.  
  33.  
  34. @login_manager.user_loader
  35. def load_user(id):
  36.     return db.session.get(User, int(id))
  37.  
  38.  
  39.  
  40. # models/tables
  41. user_books = db.Table(
  42.     "user_books",
  43.     db.metadata,
  44.     db.Column("users_id", ForeignKey("user.id"), primary_key=True),
  45.     db.Column("books_id", ForeignKey("books.id"), primary_key=True),
  46. )
  47.  
  48.  
  49. class User(UserMixin, db.Model):
  50.     '''
  51.    Many to Many relationship
  52.    '''
  53.     id: Mapped[int] = mapped_column(primary_key=True)
  54.     # unique blocks the same username etc
  55.     # I can't have Nullable=False because it will make me add the columns everytime I add a column in User table    
  56.     username: Mapped[str] = mapped_column(String(80), index=True, unique=True)
  57.     rel_books: Mapped[List["Books"]] = relationship(secondary=user_books, back_populates="rel_user")
  58.  
  59.  
  60.     def __repr__(self):
  61.         return '<User {}>'.format(self.username)
  62.  
  63. class Books(UserMixin, db.Model):
  64.     '''
  65.    Many to Many relationship
  66.    '''
  67.     id: Mapped[int] = mapped_column(primary_key=True)
  68.     book_name: Mapped[str] = mapped_column(String(120)) # todo add unique=True for all users in a function
  69.     chapter_name: Mapped[Optional[str]] = mapped_column(String(120))
  70.     rel_user: Mapped[List["User"]] = relationship(secondary=user_books, back_populates="rel_books")
  71.  
  72.     def __repr__(self):
  73.         return '<books {}>'.format(self.books_name)
  74.  
  75. '''forms'''
  76.  
  77. class CreateUserForm(FlaskForm):
  78.     '''  
  79.    This is in the "/book/create" route.
  80.    The form are book_name + book_chapters.
  81.    '''
  82.     username = StringField('username', validators=[DataRequired("The book's name is required")])  
  83.     submit = SubmitField('Submit')
  84.  
  85.  
  86.  
  87. class CreateBookForm(FlaskForm):
  88.     '''  
  89.    This is in the "/book/create" route.
  90.    The form are book_name + book_chapters.
  91.    '''
  92.     book_name = StringField('book name', validators=[DataRequired("The book's name is required")])  
  93.     submit = SubmitField('Submit')
  94.  
  95.  
  96.  
  97.  
  98. # add user
  99.  
  100. @app.route('/', methods = ['GET', 'POST'])
  101. @app.route('/home', methods = ['GET', 'POST'])
  102. def home():
  103.    
  104.     form = CreateUserForm()
  105.     if form.validate_on_submit():
  106.         username_form = form.username.data
  107.         user_db = User(username=username_form)
  108.         flash(f'user_db from User= {user_db}')
  109.        
  110.         db.session.add(user_db)
  111.         db.session.commit()
  112.         user_db = db.session.execute(db.select(User).filter_by(username=username_form)).scalar_one_or_none()
  113.         flash(f'user_db={user_db}')
  114.         if user_db != None:
  115.             flash('login successfull!!')
  116.             login_user(user_db)
  117.             return redirect(url_for('create_book'))
  118.         else:
  119.             flash('login unsucessful')
  120.  
  121.  
  122.  
  123.  
  124.     return render_template('home.html', form=form)
  125.  
  126.  
  127.  
  128.  
  129. # create book
  130.  
  131. @app.route('/book/create', methods = ['GET', 'POST'])
  132.  
  133. @login_required
  134. def create_book():
  135.  
  136.     form = CreateBookForm()
  137.     if form.validate_on_submit():
  138.         book_name_form = form.book_name.data
  139.  
  140.         user_db = db.session.execute(db.select(User).filter_by(username=current_user.username)).scalar_one_or_none()
  141.  
  142.         users_db = db.session.scalars(db.select(User)).all()
  143.         flash(f'users_db{users_db}')
  144.         # create a connection between the user and the book
  145.         add_book_info = Books(book_name=book_name_form)
  146.         user_db.rel_books.append(add_book_info)
  147.         db.session.add(add_book_info)  
  148.         db.session.commit()
  149.        
  150.        
  151.    
  152.         user_db = db.session.execute(db.select(User).filter_by(username=current_user.username)).scalar_one_or_none()
  153.         flash(f'user_db={user_db}')
  154.         # Get books_db from the user_db column by using the relationship column in the table.
  155.         books_db = user_db.rel_books
  156.         for book_db in books_db:
  157.             flash(book_db.book_name)
  158.        
  159.  
  160.         book_db = db.session.execute(db.select(Books).filter_by(book_name=book_name_form)).scalar_one_or_none()
  161.         '''
  162.        The line below does not work no matter what.
  163.        flash(f'book_db={book_db}')    
  164.        '''
  165.         # Get users_db from the book_db column by using the relationship column in the table.
  166.         users_db = book_db.rel_user
  167.         # normally I would use user_db but to make the code clearer I changed the name.
  168.         for db_user in users_db:
  169.             flash(db_user.username) # this line will work
  170.  
  171.    
  172.         #books_db = db.session.scalars(db.select(Books)).all()    
  173.         #flash(f'books_db={books_db}')
  174.  
  175.         flash('You have created a book successfully')    
  176.  
  177.     return render_template('create_book.html', title='create book', form=form)
  178.  
  179.  
  180. @app.route("/logout")
  181. @login_required
  182. def logout():
  183.     logout_user()
  184.     return redirect(url_for('home'))
  185.  
  186.  
  187.  
  188. # testing FormField or put simply testing many forms
  189.  
  190. from wtforms import FieldList, FormField
  191. from sqlalchemy import select, func
  192.  
  193.  
  194. class UsernameForms(FlaskForm):
  195.     usernames = FieldList(FormField(CreateUserForm), min_entries=0, max_entries=0)
  196.  
  197.  
  198. @app.route('/usernames', methods=['GET', 'POST'])
  199. def usernames():
  200.     # Get the number of usernames in the database
  201.     number_of_usernames_in_db = db.session.scalar(select(func.count(User.username)))
  202.     flash(number_of_usernames_in_db)
  203.     # Initialize the form with max_entries set to the number of emails
  204.     form = UsernameForms()
  205.     form.usernames.max_entries = number_of_usernames_in_db  # Set max_entries
  206.  
  207.     if form.validate_on_submit():
  208.         pass
  209.     return render_template('usernames.html', form=form)
  210.  
  211. if __name__ == '__main__':
  212.     app.run(debug=True)
  213.  
Advertisement
Add Comment
Please, Sign In to add comment